TÓM TẮT NỘI DUNG ĐỒ ÁN
Đồ án này được chia làm 6 chương:
- Chương I: Tổng quan về đề tài, giới thiệu các vấn đề sẽ đưa ra nghiên cứu trong đề tài. Giới thiệu hệ điều hành Linux, công nghệ CGI ứng dung trên Linux, và ngôn ngữ Perl cùng với bài toán sẽ đưa ra giải quyết.
- Chương II: Công nghệ CGI: gồm khái niệm, các thành phần của CGI và cách thức lập trình với CGI trong môi trường Linux. Trong chương này có đưa ra một số ví dụ về các CGI scrips được viết bằng ngôn ngữ Perl và C để làm nổi bật tính không phụ thuộc ngôn ngữ lập trình của CGI
- Chương III: Nghiên cứu lập trình với ngôn ngữ Perl. Khái niệm về biến, mảng . trong Perl được đưa ra xem xét ở đây. Đặc biệt là mảng liên hợp (assosiative array - hash ) và một số hàm chuển của Perl trong thao tác với mảng liên hợp .
- Chương IV: Phân tích bài toán quản lý sinh viên tại trường Đậi học kỹ thuật Đà nẵng. Khảo sát các thành phần của hệ thống, các nguyên tắc quản lý, các đối tượng khai thác hệ thống. Mô hình hoá và giải quyết bài toán bằng ngôn ngữ Perl theo công nghệ CGI trên môi trường Linux.
- Chương V: Kết quả thực hiện chương trình.
- Chương VI: Kết luận, nêu những kết quả đạt được về lý thuyết, thực tiễn, những hạn chế, tính khả thi và hướng phát triển của đề tài .
MỤC LỤC
MỤC LỤC 3
TỔNG QUAN VỀ ĐỀ TÀI 5
I. Tình hình sử dụng Linux 5
II. CGI và Linux 6
III. Ngôn ngữ Perl 6
IV. Mục tiêu đồ án 6
CGI 7
I. Tổng quan về CGI 7
I.1. CGI là gì ? 9
I.1.1 Khái niệm Gateway 9
I.1.2 Common Gateway Interface 10
I.2 Tại sao dùng CGI ? 11
II Lập trình với CGI 12
II.1 Lựa chọn ngôn ngữ 12
II.1.1 C/C++(Unix, Linux, Windows, Macintosh) 12
II.1.2 Perl (Unix, Linux, Windows, Macintosh) 13
II.1.3 Visual Basic (chỉ dùng trên môi trường Windows) 13
II.2 Những vấn đề cơ bản trong lập trình CGI 13
II.2.1 Chương trình ví dụ 13
II.2.2 Outputting CGI 15
II.2.2 Sơ lược về HTML Forms 17
II.2.2.1 Thẻ FORM 19
II.2.2.2 Trường text và Password 19
II.2.2.3 Nút Reset và Submit 19
II.2.2.4 Tham chiếu một số tags 19
II.2.3 Input CGI 20
Tóm lại 27
III. Cài đặt và chạy chương trình CGI 28
III.1 Cấu hình Server để chạy CGI 28
III.2 Cài đặt CGI trên server UNIX 29
III.3 Chạy chương trình CGI 30
NGÔN NGỮ PERL 31
I. Giới thiệu 31
II. Biến trong Perl 32
II.1 Biến vô hướng(Scalar variables) 33
II.2 Khối lệnh và các cấu trúc điều khiển 33
II.3 Phạm vi của biến 35
II.4 Luật trích dẫn 36
III. Mảng và mảng liên hợp 38
III.1 Mảng 38
III.2 Mảng liên hợp ( associative array - hashes ) 41
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 43
I. Đặt vấn đề 43
I.1 Dẫn nhập 43
I.2 Yêu cầu 43
I.3 Các đối tượng khai thác hệ thống 44
I.3.1 Phòng đào tạo và công tác chính trị 44
I.3.2 Các vị giáo vụ khoa 44
I.3.3 Sinh viên, gia đình sinh viên ( người dùng trên mạng) 44
I.3.4 Những thuận lợi và khó khăn 44
a) Thuận lợi 44
b) Khó khăn 44
II. Phân tích hệ thống 45
II.1 Khảo sát hệ thống 45
II.2 Sơ đồ dòng dữ liệu 46
II.3 Từ điển dữ liệu 49
II.4 Mô hình thực thể kết hợp 51
II.5 Mô hình nhị nguyên 52
III. Xây dựng chương trình 53
III.1 Chọn công cụ 53
III.2 Xây dựng mô hình Logic dữ liệu 54
III.3 Các thủ tục xử lý trong chương trình 54
1. Module nhập danh sách lớp mới ( nhapds.cgi ) 54
2. Module tìm kiếm sinh viên ( timkiem.cgi ) 54
3. Module xem danh sách ( xem_danh_sach1.cgi ) 55
4. Module xem điểm ( xem_diem.cgi ) 55
KẾT QUẢ THỰC HIỆN CHƯƠNG TRÌNH 56
I. Xây dựng môi trường hệ thống 56
II. Chạy chương trình 56
KẾT LUẬN 60
I. Những kết quả đạt được 60
I.1 Lý thuyết 60
I.2 Thực tiễn 60
II. Tính khả thi 60
III. Hạn chế 61
IV. Hướng phát triển 61
TÀI LIỆU THAM KHẢO 62
PHỤ LỤC 63
I. Module nhapds.cgi 63
II. Module xemdanhsach.cgi 65
III. Module xemdiem.cgi 67
IV. Module timkiem.cgi 69
Chương I
TỔNG QUAN VỀ ĐỀ TÀI
I. Tình hình sử dụng Linux
Linux được xem là một hiện tượng trong lĩnh vực hệ điều hành vài năm gần đây. Báo chí, các diễn đàn, các phòng nói chuyên trực tuyến trên mạng, chương trình "Tìm kiếm tương lai" của VTV3 Đài truyền hình Việt nam .Thậm chí cả chương trình "Khoa học vui" cho trẻ em của VTV1 cũng đều đã có bài đăng tải về Linux.
Vậy thì Linux là gì vậy ? Linux là một hệ điều hành giống như bao hệ điều hành khác. Nhưng nó có nhiều tính năng mạnh mà không có ở một số hệ khác. Chúng ta, chắc ai cũng đã biết về một hệ điều hành tiền bối - UNIX. Khác với các hệ điều hành của Microsoft, UNIX không rễ sử dụng với những người mới làm quen, không được thân thiện cho lắm, nhưng bù vào đó Unix là một hệ điều hành đa nhiệm thực sự, được viết ra để hỗ trợ cho nhiều người sử dụng, nó tận dụng được tối đa nguồn lực khần cứng của máy tính chính vì vậy Unix có thể chạy tốt trên một số máy tính với cấu hình rất hạn chế. Khả năng kết nối và điều hành mạng rất tốt, có thể đóng vai trò phục vụ trong hầu hết các ứng dụng Internet hiện nay. Unix là một môi trường lập trình lý tưởng cho các nhà lập trình viên chuyên nghiệp.
Linux mang dòng máu của Unix, được phát triển bởi Sun MicroSystem. Linux có đầy đủ các tính năng vốn có của Unix và Linux đã thân thiện và dễ sử dụng hơn thông qua hệ thống X-Window. ở các nước Châu Âu, đặc biệt là Pháp, Linux được đặc biệt yêu mến và sử dụng rộng rãi. Điều này cũng dễ giải thích do những tính năng tiến bộ của Linux: tính bảo mật cao, hệ thống kết nối mở, tích hợp nhiều công nghệ mới, nhiều ngôn ngữ lập trình được bao hàm trong hệ thống .
Ở nước ta, Linux được biết đến trong vòng khoảng 3 năm trở lại đây. Chúng ta đã biết, máy tính được sử dụng thực sự rộng rãi ở nước ta trong khoảng 10 năm nay, thời điểm mà các hệ điều hành của Microsoft đang thống trị - DOS, Windows 3.x. Theo truyền thống thì việc thay đổi một hệ điều hành là chuyện tương đối khó ở nước ta, phải đào tạo lại lớp người sử dụng, phải thay đổi hệ thống phần mềm .Hơn nữa Linux không phải dễ sử dụng cũng như quảnt rị hệ thống. Chính vì vậy, hiện nay ở nước ta Linux chỉ được sử dụng ở trong các môi trường xí nghiệp mang tính chuyên môn cao, còn với người dùng máy tính PC thì Linux mới chỉ mang tính khái niệm, "có biết nhưng chưa dùng".
II. CGI và Linux
Sự phát triển của Internet đã giúp chúng ta gần nhau hơn trong mọi lĩnh vực, bất kể khoảng cách và ngày đêm. Nhưng những Web server trên Internet đa số chỉ phục vụ các dịch vụ mang tính truyền thông ở mức vĩ mô. Các ứng dụng để khai thác cơ sở dữ liệu để phục vụ trong các bài toán quản lý, quảng cáo, diễn đàn, nói chuyện trực tuyến trên mạng, các dịch vụ tìm kiếm nhanh . đều đòi hỏi người dùng phải viết chương trình.
CGI (Common Gateway Interface) là một công nghệ giúp mở rộng khả năng của Web server để giải quyết các bài toán mang tính đặc thù và có thể vận hành trên mạng. Việc chọn ngôn ngữ cho lập trình CGI ít bị hạn chế do tính mềm dẻo của nó và chỉ cần tuân thủ vài nguyên tắc, chúng ta có thể viết một chương trình CGI.
Chúng ta có thể sử dụng công nghệ CGI để áp dụng cho lập trình trong mọi hệ điều hành, miễn là hệ điều hành đó có thể kết nối mạng và có một phần mềm Web server chạy trên đó. Linux là một hệ điều hành mạng, có thể đóng vai trò phục vụ trong nhiều dịch vụ đang có hiện nay (WWW, FTP, Telnet, Wais .). Hơn nữa, Linux cung cấp một Web server nổi tiếng mang tên Apache Server, phiên bản mới nhất 1.1.5. Web server này hỗ trợ lập trình CGI rất mạnh.
III. Ngôn ngữ Perl
Perl (Practical Extraction and Reporting Language) có nhiều ưu điểm của một ngôn ngữ lập trình có cấu trúc giống như C , Pascal . Song trên thực tế Perl là một ngôn ngữ diễn dịch (Interpreted language) có nhiều ưu điểm trong lập trình CGI. Thao tác xử lý chuỗi mạnh, có khả năng làm việc tốt với các biến môi trường, dễ lập trình, dễ gỡ rối . Hơn nữa Perl được tích hợp bên trong Linux.
IV. Mục tiêu đồ án
Cùng với sự gợi ý của giáo viên hướng dẫn và nhận thức của bản thân về khả năng và tầm quan trọng của các lĩnh vực đã trình bày ở trên, tôi quyết định chọn hướng nghiên cứu cho đồ án tốt nghiệp như sau:
- Hiện thực và cài đặt hệ điều hành Linux
- Nghiên cứu công nghệ CGI
- Lập trình CGI với ngôn ngữ Perl
Cuối cùng để minh họa cho kết quả nghiên cứu, tôi chọn và giải quyết bài toán: "Quản lý điểm sinh viên trường Đại học kỹ thuật Đà Nẵng" với ý tưởng như sau:
- Giúp phòng đào tạo quản lý điểm sinh viên của trường Đại học kỹ thuật
- Giúp cha mẹ sinh viên có thể biết được những thông tin về con mình kỳ nào, học môn gì, mấy điểm thông qua mạng Internet. Góp phần gắn kết mối liên lạc giữa gia đình và nhà trường.
- Đơn giản hoá việc liên lạc giữa các giáo vụ khoa và phòng đào tạo trong việc nộp điểm và cập nhật điểm cho sinh viên qua mỗi học kỳ.
70 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3515 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Lập trình CGI với ngôn ngữ Perl trên Linux, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ome/httpd/cgi-bin th× dßng ScriptAlias trong srm.conf cã thÓ nh sau
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin
§Ó gäi c¸c ch¬ng tr×nh CGI n»m trong th môc nµy chóng ta sö dông URL:
Trong ®ã hostname lµ tªn m¸y Web server, programname lµ tªn ch¬ng tr×nh CGI. VÝ dô chóng ta cã ch¬ng tr×nh Hello.cgi trong th môc /home/httpd/cgi-bin vµ trªn Web server mang tªn www.athv.edu th× ®Ó gäi ch¬ng tr×nh Hello.cgi chóng ta sö dông URL sau:
NÕu chóng ta muèn cÊu h×nh cho server nhËn biÕt mét file lµ ch¬ng tr×nh CGI th«ng qua phÇn më réng .cgi th× chóng ta cÇn thay ®æi hai file cÊu h×nh. §Çu tiªn, trong file srm.conf bá chó thÝch ë ®Çu dßng:
AddType application/x-httpd-cgi .cgi
TiÕp theo cÇn söa ®æi trong file access.conf ®Ó CGI cã thÓ thùc hiÖn ®îc trong bÊt ký th môc nµo. §Ó lµm ®iÒu nµy thªm tuú chän ExcCGI vµo dßng Option nh sau.
Option Indexes FollowSymLinks ExecCGI
III.3 Ch¹y ch¬ng tr×nh CGI
Sau khi m· nguån cña ch¬ng tr×nh CGI ®· ®îc viÕt vµ server ®· ®îc cÊu h×nh hoµn chØnh th× viÖc gäi thùc hiÖn mét ch¬ng tr×nh lµ hÕt søc ®¬n gi¶n. NÕu ch¬ng tr×nh CGI chØ cã ®Çu ra (nh hello world!) th× ë browser chóng ta chØ viÖc nhËp vµo URL. HÇu hÕt c¸c ch¬ng tr×nh CGI ®îc gäi thùc hiÖn sau khi mét form HTML ®îc submit, chóng ta cÇn biÕt form HTML ®ã vµ biÕt nã gäi thùc hiÖn ch¬ng tr×nh CGI nµo trªn server.
Ch¬ng III
Ng«n ng÷ Perl
Giíi thiÖu
Perl (Practical Extraction and Reporting Language) cã nhiÒu u ®iÓm cña mét ng«n ng÷ lËp tr×nh cã cÊu tróc gièng nh C , Pascal . . . Song trªn thùc tÕ Perl lµ mét ng«n ng÷ diÔn dÞch (Interpreted language) cã nhiÒu u ®iÓm trong lËp tr×nh CGI. Ngoµi ra, viÖc tiÕn hµnh hiÖu chØnh m· nguån cã thÓ ®îc thùc hiÖn nhanh chãng bëi viÖc biªn dÞch m· nguån ®îc tiÕn hµnh néi bé. M· nguån ( ch¬ng tr×nh )cña ng«n ng÷ Perl cã phÇn më réng lµ .pl. Tuy nhiªn, phÇn më réng nµy lµ kh«ng cÇn thiÕt, nã chØ cÇn nã ®Ó chóng ta ph©n biÖt víi m· nguån cña c¸c ng«n ng÷ kh¸c nh C, Tcl, . . .
Cã 3 c¸ch ®Ó vËn hµnh mét ch¬ng tr×nh ®îc viÕt b»ng ng«n ng÷ Perl. Nhng dï c¸ch nµo ®i n÷a th× tr×nh th«ng dÞch Perl sÏ ®äc m· nguån sau ®ã dÞch vµ ®Ö tr×nh lªn cho líp vá ®Ó ®em thùc hiÖn. Ch¬ng tr×nh viÕt theo ng«n ng÷ perl lµ mét tËp hîp c¸c lÖnh, c¸c khèi lÖnh ®îc s¾p sÕp theo mét thø tù nµo ®ã tuú c«ng viÖc cÇn gi¶i quyÕt. Mét lÖnh perl kÕt thóc b»ng dÊu chÊm ph¶y ";". Nh÷ng phÇn n»m sau ký tù # ®îc xem nh lµ chó thÝch.
1. ë dÊu nh¾c cña hÖ thèng ®¸nh tªn tr×nh th«ng dÞch Perl, sau ®ã nhÊn Enter. Khi ®ã Linux sÏ ®îi ngêi dïng nhËp vµo c¸c dßng m·. Sau khi m· nguån cña ch¬ng tr×nh ®îc nhËp vµ chóng ta nhÊn Ctrl+D ®Ó b¸o cho Perl biÕt lµ m· nguån ®Õn ®©y lµ kÕt thóc. Ch¬ng tr×nh võa nhËp vµo sÏ ®îc dÞch vµ ch¹y, kÕt qu¶ sÏ ®îc hiÖn ngay lªn mµn h×nh.
VÝ dô:
[athv /root]#perl
print "Hello World !";
Ctrl +D
Hello World
[athv /root]#
2. Theo c¸ch nµy, ch¬ng tr×nh nguån ®îc so¹n th¶o b»ng mét tr×nh so¹n th¶o nµo ®ã ( cã thÓ lµ vi, emacs. . .) vµ ®îc lu tr÷ díi d¹ng mét file v¨n b¶n b×nh thêng. Sau ®ã sö dông có ph¸p
perl
LÖnh nµy b¸o cho perl biÕt sö dông c¸c dßng trong lµm m· nguån, dÞch m· vµ cho thùc hiÖn.
3. Theo c¸ch nµy, ch¬ng tr×nh nguån còng ®îc so¹n th¶o b»ng mét tr×nh so¹n th¶o nµo ®ã vµ ®îc lu tr÷ díi d¹ng mét file v¨n b¶n. Cã hai ®iÒu cÇn lu ý: Thø nhÊt, cê cã thÓ thùc hiÖn (excuable) cña file ph¶i ®îc thiÕt lËp. Thø hai, ë ®Çu file nhÊt thiÕt ph¶i chØ ra ®êng dÉn ®Õn tr×nh th«ng dÞch Perl theo có ph¸p sau:
#!Pathname
Trªn hÇu hÕt c¸c hÖ thèng UNIX th× ®êng dÉn nµy cã thÓ lµ /usr/local/bin/perl. §iÒu nµy lµ kh«ng nhÊt thiÕt ®óng trong mäi hÖ thèng, vÝ nh hÖ thèng LINUX cña chóng ta sö dông ë ®©y ®êng dÉn nµy lµ /usr/bin/perl. Có ph¸p nµy b¸o cho kelnel biÕt tr×nh th«ng dÞch nµo sÏ xö lý c¸c m· bªn díi.
VÝ dô
#!/usr/bin/perl
print "NhËp vµo tªn b¹n:";
$yourname=;
print "Hello $yourname !\n";
Gi¶ sö ta lu tr÷ ch¬ng tr×nh nµy víi tªn lµ hello.pl vµ sau khi sö dông lÖnh chmod ®Ó ®Æt thuéc tÝnh kh¶ thi cho ch¬ng tr×nh, th× ®Ó ch¹y ch¬ng tr×nh chóng ta chØ viÖc gâ tªn ch¬ng tr×nh ( gi¶ sö ta nhËp vµo Hoµng ViÖt).
[athv /root]#hello.pl
Hello Hoµng ViÖt
[athv /root]#
Nh vËy lµ chóng ta ®· biÕt c¸ch ®Ó viÕt vµ cho thùc hiÖn mét ch¬ng tr×nh b»ng ng«n ng÷ Perl. B©y giê chóng ta sÏ kh¶o s¸t cô thÓ h¬n c¸c thµnh phÇn cña ng«n ng÷ nµy.
BiÕn trong Perl
Perl cã 3 kiÓu biÕn c¬ b¶n: kiÓu v« híng (Scalar), kiÓu m¶ng (Array) vµ m¶ng liªn hîp (Associative array). BiÕn v« híng cã thÓ gi÷ gi¸ trÞ cña mét con sè ( cã thÓ lµ sè nguyªn, sè thùc víi dÊu chÊm ®éng) hoÆc mét x©u chuçi (string). Mét m¶ng cã thÓ lu tr÷ nhiÒu d÷ liÖu v« híng theo mét thø tù liªn tiÕp, nh÷ng d÷ liÖu v« híng nµy ®îc truy cËp theo chØ môc cña m¶ng (chØ môc b¾t ®Çu tõ 0). M¶ng liªn hîp cã cÊu tróc gièng nh m¶ng trong viÖc lu tr÷ theo thø tù liªn tiÕp c¸c x©u chuçi nhng nã sö dông mét x©u chuçi kh¸c lµm chØ môc ®Ó ®Þa chØ ho¸ c¸c phÇn tö cña m¶ng thay v× mét con sè.
II.1 BiÕn v« híng(Scalar variables)
Có ph¸p cho mét biÕn v« híng lµ:
$variable_name
DÊu "$" ®øng tríc mét biÕn v« híng lµ b¾t buéc. Theo sau dÊu "$" lµ qui t¾c ®Æt tªn biÕn gièng nh c¸c ng«n ng÷ kh¸c. Chó ý r»ng, biÕn trong Perl cã thÓ kh«ng cÇn khai b¸o tríc khi sö dông, tuy nhiªn viÖc khai b¸o tríc sÏ thuËn lîi h¬n cho viÖc gì rèi vµ ®äc ch¬ng tr×nh vÒ sau. Cã thÓ ®Æt tªn biÕn trïng nhau, mét biÕn m¶ng cã thÓ trïng víi tªn biÕn v« híng hoÆc m¶ng liªn hîp, Perl kh«ng b¾t bÎ chuyÖn nµy ( có ph¸p cña biÕn m¶ng vµ m¶ng liªn hîp sÏ bµn ®Õn sau).
§Ó g¸n gi¸ trÞ cho c¸c biÕn v« híng, chóng ta h·y xem vµi vÝ dô sau:
$name = "Kamran";
$number= 100;
$phone_Number = '555-1232';
Mét biÕn trong Perl ®îc x¸c ®Þnh vµo thêi ®iÓm thùc hiÖn ch¬ng tr×nh, chóng ta sÏ nhËn ®îc mét trong c¸c gi¸ trÞ sau: mét x©u chuçi, mét con sè, hoÆc mét con trá chØ ®Õn kiÓu v« híng.
§Ó hiÓn thÞ gi¸ trÞ cña mét biÕn chóng ta sö dông c©u lÖnh print. V× vËy, ®Ó in gi¸ trÞ cña biÕn $name chóng ta dïng lÖnh sau:
print $name;
Gi¸ trÞ cña biÕn v« híng $name sÏ ®îc in lªn mµn h×nh. Perl nhËn d÷ liÖu vµo tõ ®Çu vµo chuÈn (bµn phÝm) vµ xuÊt d÷ liÖu ra ®Çu ra chuÈn (mµn h×nh).
II.2 Khèi lÖnh vµ c¸c cÊu tróc ®iÒu khiÓn
Theo c¸c ng«n ng÷ quen thuéc nh C, Pascal th× chóng ta cã thÓ gäi ®©y lµ mét lÖnh kÐp, ph¸t biÓu kÐp, hay mét thuËt ng÷ t¬ng tù nµo ®ã. §¬n gi¶n trong Perl, khèi lÖnh lµ tËp hîp nhiÒu lÖnh (cã thÓ lµ mét khèi lÖnh kh¸c) n»m gän trong cÆp dÊu mãc nhän "{ vµ }". ViÖc ®Þnh nghÜa vµ nhËn biÕt c¸c khèi lÖnh rÊt quan träng, ®Æc biÖt khi chóng ta quan t©m ®Õn tÇm vùng cña biÕn trong ch¬ng tr×nh, gi¸ trÞ cña nã trong mét thêi ®iÓm nµo ®ã còng nh ¶nh hëng cña c¸c c©u lÖnh ®Õn gi¸ trÞ cña biÕn. Th«ng thêng, chóng ta hay gÆp c¸c khèi lÖnh ë c¸c cÊu tróc lÆp, c¸c cÊu tróc ®iÒu kiÖn, c¸c ®Þnh nghÜa ch¬ng tr×nh con . . . Tuy nhiªn, mét khèi lÖnh nh sau lµ hoµn toµn hîp lÖ:
{
print "chµo b¹n\n";
print "chµo b¹n lÇn n÷a\n";
vµi lÖnh kh¸c;
}
Sau ®©y lµ mét vµi trêng hîp sö dông khèi lÖnh phæ biÕn:
{# Khèi lÖnh ®¬n gi¶n. }while() {... thùc hiÖn c¸c m· lÖnh ë ®©y trong khi ®óng;}until() { # Ngîc l¹i víi ph¸t biÓu while.... thùc hiÖn c¸c m· lÖnh ë ®©y trong khi sai;
}do {... thùc hiÖn c¸c lÖnh trong khèi Ýt nhÊt mét lÇn...... dùng khi sai ...} while();do {... thùc hiÖn c¸c lÖnh trong khèi Ýt nhÊt mét lÇn...... dùng khi ®óng... } until();if () {...thùc hiÖn c¸c lÖnh khi ®óng;} else {...thùc hiÖn c¸c lÖnh khi sai;}if () {...thùc hiÖn c¸c lÖnh khi ®óng;} elsif () {...thùc hiÖn c¸c lÖnh khi ®óng;....} elsif () {...thùc hiÖn c¸c lÖnh khi ®óng;
} else {... thùc hiªn c¸c lÖnh khi c¸c sai;}unless () { # ngîc l¹i víi ph¸t biÓu If. ... thùc hiªn c¸c lÖnh khi c¸c sai; }
Th«ng qua c¸c vÝ dô trªn vÒ c¸ch sö dông c¸c khèi lÖnh cña Perl, mét c¸ch gi¸n tiÕp chóng ta ®· kh¶o s¸t c¸c cÊu tróc ®iÒu khiÓn c¬ b¶n cña Perl.
§iÒu kiÖn trong c¸c khèi lÖnh nµy lµ bÊt kú mét thø g× cña Perl, tõ mét biÕn ®Õn mét biÓu thøc, miÔn lµ cã gi¸ trÞ tr¶ vÒ lµ hoÆc gi¸ trÞ ®óng (true) hoÆc gi¸ trÞ sai (false). Mét gi¸ trÞ true lµ mét gi¸ trÞ kh¸c kh«ng (non-zero), hoÆc mét chuçi kh«ng rçng (non-empty string).
II.3 Ph¹m vi cña biÕn
C¸c khèi lÖnh cã thÓ ®îc khai b¸o n»m trong c¸c khèi lÖnh kh¸c ®Ó t¹o nªn c¸c cÊu tróc khèi lång nhau(khèi lÖnh ë ®©y cã thÓ lµ mét thñ tôc, hµm). BiÕn ®îc khai b¸o trong trong mét khèi lÖnh nµo ®ã th× theo ngÇm ®Þnh th× nã lµ biÕn toµn côc ®èi víi toµn bé ch¬ng tr×nh. §Ó giíi h¹n ph¹m vi cña biÕn trong mét khèi lÖnh, trong mét ch¬ng tr×nh con perl cung cÊp cho chóng ta hai hµm lµ my() vµ local(). VÝ dô chóng ta cã thÓ khai b¸o biÕn trong mét khèi nh sau: my $variable1. Theo c¸ch nµy $variable1 chØ truy cËp ®îc trong néi bé khèi lÖnh mµ biÕn ®îc khai b¸o, kh«ng thÓ truy cËp ®îc trong tÊt c¶ c¸c khèi con. Ngoµi ra cã thÓ khai b¸o: local $variable2( nÕu cã nhiÒu biÕn cÇn khai b¸o chóng ta sö dông cÆp ngoÆc ®¬n vµ c¸c biÕn c¸ch nhau bëi dÊu ph¶y ","). Theo c¸ch nµy $variable2 cã thÓ truy cËp ®îc trong khèi nã ®îc khai b¸o vµ tÊt c¶ c¸c khèi con.
H×nh vÏ minh häa ph¹m vi cña biÕn trong Perl
my $x;
local $y;
{
}
{
}
}
#Khèi A
my $f=$x; # not OK
$g= $y; # OK
#Khèi B
my $k=$g; #OK
my $m=$f+$g+$y;
Main
§Ó hiÓu s©u s¾c vÊn ®Ò nµy chóng ta xem vÝ dô sau:
firstSub("AAAAA", "BBBBB");
sub firstSub{
local ($firstVar) = $_[0];
my($secondVar) = $_[1];
print("firstSub: firstVar = $firstVar\n");
print("firstSub: secondVar = $secondVar\n\n");
secondSub();
print("firstSub: firstVar = $firstVar\n");
print("firstSub: secondVar = $secondVar\n\n");
}
sub secondSub{
print("secondSub: firstVar = $firstVar\n");
print("secondSub: secondVar = $secondVar\n\n");
$firstVar = "ccccC";
$secondVar = "DDDDD";
print("secondSub: firstVar = $firstVar\n");
print("secondSub: secondVar = $secondVar\n\n");
}
KÕt qu¶ ch¹y ch¬ng tr×nh
firstSub: firstVar = AAAAA
firstSub: secondVar = BBBBB
secondSub: firstVar = AAAAA
Use of uninitialized value at test.pl line 19.
secondSub: secondVar =
secondSub: firstVar = ccccC
secondSub: secondVar = DDDDD
firstSub: firstVar = ccccC
firstSub: secondVar = BBBBB
II.4 LuËt trÝch dÉn
Cã ba kiÓu trÝch dÉ kh¸c nhau cã thÓ sö dông trong Perl. DÊu nh¸y kÐp ("vµ") ®îc dïng ®Ó nhËn biÕt mét x©u ch÷. TÊt c¶ c¸c biÕn v« híng n»m trong cÆp dÊu nh¸y kÐp ®Òu ®îc Perl ®Þnh gi¸. §Ó buéc Perl kh«ng ®Þnh gi¸ nh÷ng phÇn trong mét lêi trÝch dÉn chóng ta sö dông dÊu nh¸y ®¬n ( ' ). TÊt c¶ nh÷ng dßng kh«ng n»m trong c¸c cÆp dÊu trÝch dÉn, kh«ng n»m sau dÊu chó thÝch (#) ®Òu ®îc Perl coi lµ m· lÖnh vµ sÏ ®îc Perl diÔn dÞch. Perl sÏ cè g¾ng ®Ó ®Þnh gi¸ chóng thµnh c¸c d¹ng cña biÓu thøc hoÆc c¸c c©u lÖnh mµ Perl cã thÓ hiÓu ®îc. Cuèi cïng, ®Ó ch¹y mét c©u lÖnh cña ch¬ng tr×nh shell vµ nhËn kÕt qu¶ tr¶ vÒ chóng ta sö dông dÊu nh¸y ngîc ( ` ).
§Ó hiÓu nh÷ng phÇn võa tr×nh bµy, chóng ta h·y xem vÝ dô Perl sau ®©y:
1 #!/usr/bin/perl2 $RedHat="Free";3 print "\$RedHat = $RedHat \n";4 print '\$RedHat = $RedHat \n';5 print "\n\n BEEP! \a \LSOME BLANK \ELINES HERE \n\n";6 $date = `date +%D`;7 print "Today is [$date] \n";8 chop $date;9 print "Date sau khi c¾t bá dÊu xuèng dßng: [".$date."]\n";
KÕt qu¶ ®Çu ra cña ch¬ng tr×nh
$RedHat = Free\$RedHat=$RedHat \nBEEP! some blank LINES HEREToday is [03/29/2000]Date sau khi c¾t bá dÊu xuèng dßng: [03/29/2000]
Dßng 1 lµ dßng b¾t buéc víi c¸c ch¬ng tr×nh Perl. Dßng 2 g¸n cho biÕn $RedHat x©u ch÷ Free. Dßng 3 cho hiÓn thÞ gi¸ trÞ cña biÕn $RedHat gi÷a cÆp nh¸y kÐp (" "), ký tù $ lµ có ph¸p cña biÕn vo híng nªn ®Ón in ký tù nµy trong cÆp ng¸y kÐp chóng ta sö dông dÊu (\) ®øng tríc nã. §iÒu nµy sÏ ®îc Perl nhËn biÕt. TiÕp theo gi¸ trÞ cña biÕn $RedHat sÏ ®îc ®Þnh gi¸ tríc khi in ra. Dßng 4 gièng hÖt dßng 3 chØ cã ®iÒu thay cÆp nh¸y kÐp b»ng cÆp nh¸y ®¬n, b¸o cho Perl kh«ng cÇn ®Þnh gi¸ vµ chØ viÖc hiÓn thÞ. Dßng 5 cho hiÓn thÞ vµi ký tù xuèng dßng, mét tiÕng BEEP víi vµi ®Þnh d¹ng
B¶ng c¸c ký tù ®Æc biÖt trong Perl
Ký tù
M« t¶
\\
Backslash.
\0ooo
Sè ë hÖ c¬ sè 8 (vÝ dô, \0213).
\a
Beep.
\b
Backspace.
\c
Ký tù c ®îc trÝch dÉn (vÝ dô, \$ thµnh $).
\c¸c
ChÌn ký tù ®iÒu khiÓn C.
\l
Ký tù tiÕp theo ®îc in thêng.
\L \E
TÊt c¶ nh÷ng ký tù n»m gi÷a \L vµ \E ®îc in thêng.
\n
New line (line feed).
\r
Carriage return (MS-DOS).
\t
Tab.
\u
Ký tù tiÕp theo ®îc in hoa.
\U \E
TÊt c¶ nh÷ng ký tù n»m gi÷a \U vµ \E ®îc in HOA.
\x##
Sè Hexa d¹ng ## (vÝ dô, \x1d).
Dßng 6 sö dông cÆp dÊu nh¸y ngîc ®Ó thùc hiÖn lÖnh mét shell vµ nhËn gi¸ trÞ tr¶ vÒ trong biÕn $date. LÊy ngµy th¸ng hiÖn hµnh cña hÖ thèng vµ cho in ra ë dßng 7. Chó ý, biÕn $date cã chøa 1 ký tù \n ë sau cïng, ®Ó c¾t bá ®i chóng ta dïng lÖnh chop.
C¸c con sè trong Perl ®îc lu tr÷ díi d¹ng dÊu chÊm ®éng; kÓ c¶ c¸c sè nguyªn còng vËy. Cã mét bé c¸c to¸n tö chóng ta cã thÓ sö dông ®èi víi c¸c con sè ®îc liÖt kª trong b¶ng sau.
C¸c to¸n tö thao t¸c sè
To¸n tö
M« t¶
$r = $x + $y
Adds $x to $y and assigns the result to $r
$r = $x - $y
Subtracts $y from $x and assigns the result to $r
$r = $x * $y
Multiplies $y and $x and assigns the result to $r
$r = $x / $y
Divides $x by $y and assigns the result to $r
$r = $x % $y
Modulo; divides $x by $y and assigns the remainder to $r
$r = $x ** $y
Raises $x to the power of $y and assigns the result to $r
$r = $x << $n
Shifts bits in $x left $n times and assigns to $r
$r = $x >> $n
Shifts bits in $x right $n times and assigns to $r
$r = ++$x
Increments $x and assigns $x to $r
$r = $x++
Assigns $x to $r and then increments $x
$r += $x;
Adds $x to $r and then assigns to $r
$r = --$x
Decrements $x and assigns $x to $r
$r = $x--
Assigns $x to $r and then decrements $x
$r -= $x;
Subtracts $x from $r and then assigns to $r
$r /= $x;
Divides $r by $x and then assigns to $r
$r *= $x;
Multiplies $r by $x and then assigns to $r
$r = $x $y
$r is 1 if $x > $y; 0 if $x == $y; -1 if $x < $y
$r = $x || $y
$r is the logical OR of variables $x and $y
$r = $x && $y
$r is the logical AND of variables $x and $y
$r = ! $x
$r is the opposite Boolean value of $x
C¸c to¸n tö quan hÖ
To¸n tö
M« t¶
$x == $y
True if $x is equal to $y
$x != $y
True if $x is not equal to $y
$x < $y
True if $x is less than $y
$x <= $y
True if $x is less than or equal to $y
$x > $y
True if $x is greater than $y
$x >= $y
True if $x is greater than or equal to $y
$x eq $y
True if string $x is equal to string $y
$x ne $y
True if string $x is not equal to string $y
$x lt $y
True if string $x is less than string $y
$x le $y
True if string $x is less than or equal to string $y
$x gt $y
True if string $x is greater than string $y
$x ge $y
True if string $x is greater than or equal to string $y
$x x $y
Repeats $x, $y times
$x . $y
Returns the concatenated value of $x and $y
$x cmp $y
Returns 1 if $x gt $y; 0 if $x eq $y; -1 if $x lt $y
$w ? $x : $y
Returns $x if $w is true; $y if $w is false
M¶ng vµ m¶ng liªn hîp
III.1 M¶ng
ViÖc hiÓu s©u s¾c vÒ biÕn v« híng trong Perl lµ hÕt søc quan träng, ®iÒi ®ã gióp chóng ta tiÕp thu kh¸i niÖm vÒ m¶ng(array) vµ m¶ng liªn hîp (associative array-hashed) mét c¸ch dÔ dµng.
M¶ng trong Perl ®¬n gi¶n chØ lµ tËp hîp c¸c d÷ liÖu v« híng mµ chóng ®îc chØ môc bëi c¸c con sè nguyªn. KÝch thíc cña mét m¶ng trong Perl ®îc tù ®éng co d·n (grow and shrink automatically), kh«ng gièng nh ë mét sè ng«n ng÷ kh¸c kÝch thíc cña m¶ng ®ßi hái ph¶i ®îc ®Þnh nghÜa tríc. Nh÷ng biÕn m¶ng trong Perl ®îc miªu t¶ víi có ph¸p sau:
@array_variables_name
DÊu @ ®øng tríc tªn biÕn lµ b¾t buéc, ®Ó ph©n biÖt víi c¸c lo¹i biÕn kh¸c. M¶ng trong Perl còng gièng trong C lµ chóng ®îc chØ môc b¾t ®Çu tõ 0 trë lªn.
M«t vµi vÝ dô vÒ m¶ng trong Perl
@ArrayName = ('This', 'is' , 'a' , 'array');
Khi lµm viÖc víi c¸c d÷ liÖu chuçi ®· ®îc s¾p xÕp s½n ta cã thÓ khai b¸o ®¬n gi¶n h¬n:
@arrayName = (1..10);
M¶ng nµy t¬ng ®¬ng víi
@arrayName = (1,2,3,4,5,6,7,8,9,10);
HoÆc khai b¸o
@arrayName = ('a'..'e');
M¶ng nµy t¬ng ®¬ng víi
@arrayName = ('a','b','c','d','e');
Mçi thµnh phÇn cña m¶ng lµ mét d÷ liÖu v« híng. V× vËy, ta cã thÓ g¸n gi¸ trÞ cho mçi thµnh phÇn th«ng qua chØ sè cña nã theo cÊu tróc nh sau:
$ArrayName[index] = value;
Sö dông dÊu $ vµ cÆp dÊu ngoÆc vu«ng [] dïng ®Ó truy cËp ®Õn c¸c thµnh phÇn cña m¶ng th«ng qua chØ môc cña nã.
Mét sè hµm thao t¸c víi m¶ng.
Tªn hµm
M« t¶
$scalar = @#array
Gi¸ trÞ chØ môc lín nhÊt cña m¶ng. VÝ dô ta cã @array=(1,2,3) th× $scalar mang gi¸ trÞ 2.
$scalar = @array
BiÕn $scalar sÏ lu gi¸ trÞ kÝch cì cña m¶ng array. Nh vÝ dô trªn th× $scalar = 3.
Hµm scalar()
Có ph¸p: scalar(@array). Hµm nµy tr¶ vÒ sè phÇn tö cña m¶ng.
Hµm push()
Có ph¸p: push(@array, (danh, s¸ch, thµnh, phÇn)). Hµm nµy thªm c¸c phÇn tö trong (danh, s¸ch, thµnh, phÇn) vµo cuèi m¶ng @array. VÝ dô:
@array = ('one');
push(@array, @array);
# Lóc nµy m¶ng cã hai phÇn tö ('one','one')
push(@array, ('two','three',));
# thªm ('two','three',) vµ lóc nµy m¶ng cã 4 thµnh phÇn
# "one, one, two,three'".
Hµm pop()
Có ph¸p: pop(@array). §©y lµ hµm ngîc cña hµm push, hµm nµy lo¹i bá phÇn tö cuèi cïng trong m¶ng vµ tr¶ vÒ gi¸ trÞ cña phÇn tö ®ã.
VÝ dô:
@array=('one', 'two', 'three');
$scalar = pop(@array);
# biÕn $scalar nhËn gi¸ trÞ 'three'
# m¶ng @array cßn l¹i hai thµnh phÇn ('one', 'two'');
Hµm unshift()
Có ph¸p: unshift(@array, phÇn_tö). Hµm nµy thùc hiÖn c«ng viÖc gièng hµm push() lµ thªm phÇn thö vµo m¶ng, chØ kh¸c ë chç unshift() thªm phÇn tö vµo ®Çu danh s¸ch. ChØ sè cña phÇn tö míi ®îc thªm sÏ lµ 0 vµ chØ sè c¸c phÇn tö cßn l¹i tù ®éng t¨ng thªm 1.
VÝ dô:
@array = ('one', 'two', 'three');
unshift (@array, 'zero');
# m¶ng @array trë thµnh ('zero', 'one', 'two', 'three');
Hµm shift()
Có ph¸p: shift(@array) . Hµm nµy thùc hiªn c«ng viÖc ngîc l¹i víi hµm unshift() . Lo¹i bá phÇn tö ®Çu tiªn cña m¶ng, tr¶ vÒ gi¸ trÞ cña phÇn tö bin lo¹i bá.
Vi dô:
@array = ('one', 'two', 'three');
$scalar = shift(@array);
# BiÕn $scalar mang gi¸ trÞ lµ 'one'
Hµm splice()
Splice() lµ mét hµm thao t¸c m¶ng phøc t¹p. Nã cã nhiÒu chøc n¨ng m¹nh vµ cã 3 có ph¸p dö dông sau:
Có ph¸p 1: splice(@array, $position, $length, @list);
Theo có ph¸p nµy, splice sÏ lo¹i bá c¸c phÇn tö cña @array tõ vÞ trÝ $position vµ víi sè phÇn tö lµ $length. §ång thêi thªm c¸c phÇn tö trong @list vµo vÞ trÝ b¾t ®Çu tõ $position. Tr¶ vÒ m¶ng gåm c¸c phÇn tö ®· bÞ lo¹i bá.
Có ph¸p 2: splice(@array, $position, $length);
Theo có ph¸p nµy, splice sÏ Lo¹i bá c¸c phÇn tö tõ $position vµ víi sè phÇn tö lµ $length, kh«ng thªm vµo m¶ng phÇn tö nµo c¶. Tr¶ vÒ m¶ng gåm c¸c phÇn tö ®· bÞ lo¹i bá.
Có ph¸p 3: splice(@array, $position);
Lo¹i bá c¸c phÇn tö tõ vÞ trÝ $position ®Õn cuèi m¶ng. Tr¶ vÒ m¶ng gåm c¸c phÇn tö ®· bÞ lo¹i bá.
VÝ dô :
@array = ('a','b','c','d');
$scalar = splice(@array, $#array); # gièng pop(@array);
# @array trë thµnh ('a', 'b', 'c')
# $scalar mang gi¸ trÞ 'd'
@returnarray = splice(@array, 1, 2);
# @returnarray trë thµnh ('b','c');
# @array trë thµnh ('a','d);
# lo¹i bá hai phÇn tö trong
# @array, b¾t ®Çu tõ vÞ trÝ 1.
@addarray = ('b1','b2');
splice(@array, 2, 0, @addarray);
# @array trë thµnh (a,b, b1,b2,c, d)
# lo¹i bá zero phÇn tö trong
# @array, b¾t ®Çu tõ vÞ trÝ 2. Vµ thªm
# @addarray vµo.
Hµm reverse()
Có ph¸p: reverse(@array). Dïng ®Ó ®¶o ngîc thø tù m¶ng.
VÝ dô;
@array = (1..10);
print "m¶ng sau khi ®¶o ngîc";
foreach $element (reverse(@array)){
print $element ;
}
kÕt qu¶: 10 9 8 7 6 5 4 3 2 1
Hµm split()
Hµm split() cung cÊp mét ph¬ng ph¸p ®Ó ph©n chia mét biÕn v« híng díi d¹ng mét x©u chuçi thµnh mét m¶ng. Víi vÞ trÝ c¸c ®iÓm c¾t ®îc chØ ra bëi mét biÓu thøc thêng (regular expression) hoÆc mét mÉu (pattern) nµo ®ã.
Có ph¸p: @array = split(REGEXP, $scalar, $limit);
Trong ®ã:
REGXP lµ mét biÓu thøc thêng.
$scalar lµ chuçi cÇn c¾t
$linit lµ tham sè tuú ®Þnh. NÕu cã th× tham sè nµy chØ ra sè phÇn tö cña m¶ng sau khi c¾t. phÇn cßn l¹i cña chuçi sÏ ®îc g¸n cho phÇn tö cuèi cïng cña m¶ng nÕu sè ®iÓm c¾t nhiÒu h¬n sè phÇn tö.Nõu kh«ng cã tham sè nµy th× sè phÇn tö cña m¶ng sÏ b»ng sè ®iÓm c¾t.
VÝ dô;
$scalar = "Céng hßa x· héi";
@array_of_word = split( ' ', @scalar);
# Lóc nµy @array_of_word =('Céng', 'hßa', 'x·', 'héi')
@array_of_char = split ('', $array_of_word[0]);
# Lóc nµy @array_of_char = ('C', '«', 'n', 'g')
Hµm join()
Hµm join() thùc hiÖn nèi c¸c phÇn tö cña m¶ng l¹i víi ®iÓm nèi lµ mét ký tù ®îc chØ ra. Hµm tr¶ vÒ mét biÕn v« híng d¹ng chuçi.
Có ph¸p: $scalarName = join("chars_to_join", @arrayName);
VÝ dô :
@array =('Céng', 'hßa', 'x·', 'héi');
$scalar = join(' ', @array);
# Lóc nµy $scalar = "Céng hßa x· héi"
III.2 M¶ng liªn hîp ( associative array - hashes )
M¶ng liªn hîp trong Perl mµ nhiÒu ngêi gäi lµ hashes lµ mét tËp hîp biÕn v« híng víi chØ môc lµ mét biÕn v« híng kh¸c thay v× lµ mét con sè nguyªn nh m¶ng. Gièng nh m¶ng, hashes cã thÓ tù ®éng co gi·n kÝch thíc m«ic khi chóng ta thªm hoÆc bít c¸c phÇn tö cña chóng. V× vËy, kÝch thíc cña hashes kh«ng cÇn ®îc khai b¸o tríc khi sö dông. VÒ cÊu tróc th× hashes gièng nh cÊu tróc mét m¶ng truyÒn thèng, nhng chØ môc cña nã ®îc ®Þnh nghÜa vµ tham kh¶o bëi chÝnh b¶n th©n nã. Víi t tëng phÇn tö thø nhÊt lµ chØ môc (kho¸ t×m kiÕm) cña phÇn tö thø hai, thø ba lµ chØ môc cña thø t . . .
Hashes cã thÓ sö dông mét c¸ch mÒm dÎo h¬n so víi m¶ng nhê viÖc chóng ta cã thÓ sö dông bÊt kú mét lo¹i d÷ liÖu v« híng nµo ®Ó lµm chØ môc ( cã thÓ lµ c¸c con sè, ch÷ c¸i, x©u chuçi . . . ). Tuy nhiªn, cã mét kh¸i niÖm quan träng, ®ã lµ hashes kh«ng cã kh¸i niÖm thø tù bªn trong. §iÒu ®ã cã nghÜa lµ chóng ta kh«ng thÓ biÕt mét phÇn tö nµo ®ã n»m ë vÞ trÝ thø bao nhiªu trong hashes.
Có ph¸p khai b¸o mét hashes ®îc b¾t ®Çu b»ng mét ký tù phÇn tr¨m (%) vµ theo sau lµ tªn cña hashes. Cã hai c¸ch khëi t¹o hashes nh sau:
%HashName = (key1, value1, key2, value2);
hoÆc
%HashName = (key1 => value1, key2 => value2);
§Ó truy cËp ®Õn mét phÇn tö cña hashes ta sö dông dÊu $ ®øng tríc tªn cña hashes vµ tªn cña kho¸ th× n»m trong cÆp dÊu ngoÆc nhän " {} ". Theo có ph¸p sau;
$hashNAME{key1}=value1;
VÝ dô:
%hash = (
'bmp', 'Bitmap file'
'cpp', 'C++ Source file'
'txt', 'Text file');
$hash{'gif'} = 'Gif image file'; # Thªm mét phÇn tö víi chØ môc gif
print " value(%hash)\n " ; # In tÊt c¶ c¸c gi¸ trÞ cña hash kh«ng in chØ môc
LÖnh nµy in ra
Bitmap file
C++ Source file
Text file
Gif image file
Mét sè hµm thao t¸c víi hashes.
Tªn hµm
M« t¶
Hµm keys()
Có ph¸p: key(%hash_name). Tr¶ vÒ danh s¸ch c¸c kho¸ cña m¶ng liªn hîp ®îc ®a ra bëi %hash_name, danh s¸ch tr¶ vÒ díi d¹ng mét m¶ng.
VÝ dô:
%hashName = (
key1 => value1,
key2 => value2,
key3 => $scalar );
@arrayName = keys(%hashName); # @arrayName b»ng
# ('key2','key3','key1');
Hµm values()
Có ph¸p: values(%hash_name). Tr¶ vÒ danh s¸ch c¸c gi¸ trÞ cña m¶ng liªn hîp ®îc ®a ra bëi %hash_name, danh s¸ch tr¶ vÒ díi d¹ng mét m¶ng.
VÝ dô: Víi m¶ng liªn hîp ®· khai b¸o ë trªn sö dông hµm values():
@arrayName = values(%hashName);
ta thu ®îc @arrayName = (value1, value1, $scalar).
Hµm each()
Có ph¸p: each (%hash_name). Hµm nµy tr¶ vÒ mét cÆp lµ kho¸ vµ trÞ t¬ng øng cña m¶ng liªn hîp.
VÝ dô;
while (($key, $value) = each %hashName){
print "$key, $value\n";
} # in ta tÊt c¶ c¸c kho¸ vµ gi¸ trÞ t¬ng øng cña m¶ng liªn hîp
Hµm sort()
Có ph¸p: sort (%hash_name). Cã t¸c dông s¾p xÕp l¹i m¶ng liªn hîp theo gi¸ trÞ cña kho¸.
Hµm delete()
Có ph¸p: delete $hash_name{key}.Xo¸ phÇn tö cã kho¸ lµ key ra khái m¶ng liªn hîp.
Hµm exists()
KiÓm tra sù tån t¹i cña mét phÇn tö víi kho¸ ®· biÕt. Tr¶ vÒ true nÕu cã tån t¹i phÇn tõ false nÕu ngîc l¹i.
VÝ dô:
if (exists($dictionary{'dog'})){
print $dictionary{'dog'};
}
Ch¬ng IV
Ph©n tÝch vµ thiÕt kÕ hÖ thèng
§Æt vÊn ®Ò
I.1 DÉn nhËp
Nh»m t×m hiÓu c¸c kü thuËt khai th¸c c¸c hÖ thèng th«ng tin, c¸c thao t¸c truy cËp c¬ së d÷ liÖu trªn hÖ thèng LINUX. Víi yªu cÇu cô thÓ lµ x©y dùng hÖ thèng th«ng tin qu¶n lý ®iÓm cña sinh viªn trêng ®¹i häc kü thuËt §µ N½ng, gióp phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ trêng §¹i häc kü thuËt. §ång thêi gióp c¸c sinh viªn cña trêng cã thÓ biÕt râ ®iÓm c¸c m«n häc cña m×nh qua c¸c häc kú vµ gióp c¸c gia ®×nh cã con c¸i häc t¹i trêng cã thÓ theo dâi ®îc t×nh h×nh häc tËp, ®iÓm sè cña con m×nh, tõ ®ã kÕt liªn mèi quan hÖ gi÷a gia ®×nh vµ nhµ trêng nh»m phôc vô tèt h¬n c«ng t¸c ®µo t¹o sinh viªn ë trêng còng nh ë nhµ. Víi c¸c kü thuËt ®· t×m hiÓu, t«i tiÕn hµnh x©y dùng thö hÖ thèng nãi trªn, tÝch hîp trªn m¹ng internet víi môc tiªu hiÖn thùc ®îc mét c¸ch mét c¸ch tèi ®a ý tëng ®· nªu trªn.
I.2 Yªu cÇu
HÖ thèng th«ng tin qu¶n lý sinh viªn trêng §¹i häc kü thuËt §µ n½ng ®îc viÕt b»ng ng«n ng÷ Perl theo c«ng nghÖ CGI trªn hÖ thèng LINUX nh»m gi¶i quyÕt c¸c vÊn ®Ò sau:
- Gióp phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ trêng qu¶n lý ®iÓm cña sinh viªn mét c¸ch dÔ dµng.
- Th«ng qua c¸c vÞ gi¸o vô cña c¸c khoa, ®iÓm cña sinh viªn ®îc nhËp, cËp nhËt.
- Gióp c¸c gi¸o vô in danh s¸ch sinh viªn c¸c kú thi th«ng qua giao diªn Web.
- Sinh viªn vµ gia ®×nh cña hä cã thÓ xem xÐt th«ng tin vÒ ®iÓm, c¸c m«n häc trong c¸c kú häc s¾p tíi cña b¶n th©n ( con c¸i ) hä th«ng qua m¹ng Internet.
I.3 C¸c ®èi tîng khai th¸c hÖ thèng
I.3.1 Phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ
Lµ n¬i cã quyÒn cao nhÊt ®èi víi hÖ thèng th«ng tin. ChÞu tr¸ch nhiÖm trong c¸c thµnh phÇn kh¸c cña hÖ thèng. Mét ngêi thuéc ®èi tîng nµy cã thÓ:
- Thùc hiÖn tÊt c¶ c¸c c«ng viÖc mµ mäi ngêi kh¸c cã thÓ ®èi víi hÖ thèng.
- CËp nhËt, thªm bít th«ng tin vÒ sinh viªn cña tÊt c¶ c¸c khoa
- CÊp ph¸t, thay ®æi, xo¸ quyÒn khai th¸c th«ng tin hÖ thèng cña mét ngêi sö dông
I.3.2 C¸c vÞ gi¸o vô khoa
Lµ nh÷ng ngêi trÞu tr¸ch nhiªm trùc tiÕp vÒ th«ng tin cña sinh viªn khoa m×nh trong mét thêi ®iÓm x¸c ®Þnh nµo ®ã. QuyÒn sö dông hÖ thèng (user, password) cña c¸c vÞ gi¸o vô ®îc cÊp ph¸t bëi phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ. Mét vÞ gi¸o vô kh¶ n¨ng:
- CËp nhËt, thay ®æi th«ng tin cña sinh viªn thuéc khoa m×nh
- NhËp, cËp nhËt ®iÓm cña sinh viªn khoa m×nh sau mçi kú thi
- TÝnh ®iÓm trung b×nh, xÐt häc bæng cho sinh viªn trong khoa
I.3.3 Sinh viªn, gia ®×nh sinh viªn ( ngêi dïng trªn m¹ng)
Ngêi sö dông thuéc ®èi tîng nµy cã kh¶ n¨ng:
- Cã thÓ xem th«ng tin vÒ ®iÓm cña b¶n th©n vµ c¸c nh÷ng ngêi
- Cã thÓ xem tríc kÕ ho¹ch häc tËp, danh s¸ch c¸c m«n häc cña tÊt c¶ c¸c häc kú
I.3.4 Nh÷ng thuËn lîi vµ khã kh¨n
ThuËn lîi
- HÖ thèng cã thÓ tÝch hîp tèt trªn m¹ng Internet. Cã thÓ khai cïng víi c¸c dÞch vô ®i kÌm trªn m¹ng.
- Ngêi tham gia sö dông, ®iÒu hµnh hÖ thèng cã thÓ ph©n bè kh¾p mäi n¬i, miÔn lµ ®îc kÕ nèi vµo m¹ng Internet.
Khã kh¨n
- Do hÖ thèng cã nhiÒu ngêi sö dông, ph©n chia theo nhiÒu møc ®Æc quyÒn kh¸c nhau nªn viÖc ®ång bé d÷ liÖu gÆp nhiÒu khã kh¨n.
- ViÖc b¶o mËt vµ an toµn d÷ liÖu còng gÆp nhiÒu khã kh¨n khi hÖ thèng vËn hµnh trªn m¹ng.
- ViÖc khai th¸c Internet cña c¸c ®èi tîng trong hÖ thèng còng gÆp nhiÒu khã do gia thµnh vµ ®iÒu kiÖn cña níc ta hiÖn nay.
Ph©n tÝch hÖ thèng
II.1 Kh¶o s¸t hÖ thèng
C«ng viÖc qu¶n lý sinh viªn cña bé phËn gi¸o vô - phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ trêng §¹i häc kü thuËt §µ n½ng.
§Ò tµi chØ giíi h¹n kh¶o s¸t hÖ thèng th«ng tin qu¶n lý kÕt qu¶ häc tËp cña m«ic sinh viªn trong toµn trêng.
Mçi sinh viªn khi tróng tuyÓn vµo trêng (thi ®Ëu ®¹i häc) ph¶i cung cÊp cho phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ c¸c th«ng tin sau: hä, tªn ngµy sinh, n¬i sinh, giíi tÝnh, tªn khoa, nghµnh häc . . .
Sau ®ã phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ sÏ cÊp cho mçi sinh viªn mét sè m· riªng (thùc tÕ lµ sè thÎ sinh viªn).
Phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ sÏ qu¶n lý kÕt qu¶ häc tËp cña mçi sinh viªn theo tõng häc kú, c¶ n¨m häc vµ suèt thêi gian häc t¹i trêng.
Phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ kh«ng qu¶n lý trùc tiÕp ®iÓm cña sinh viªn mµ th«ng qua hÖ thèng c¸c vÞ gi¸o vô cña c¸c khoa.
Trong trêng cã nhiÒu khoa. Cô thÓ cã 8 khoa qu¶n lý sinh viªn vµ 5 khoa kh«ng qu¶n lý sinh viªn:
Trong mçi khoa l¹i chia ra nhiÒu nghµnh chuyªn m«n:
- Khoa Ho¸: Silic¸t, thùc phÈm, ho¸ dÇu, polyme, ®iÖn ho¸
- Khoa §iÖn: §iÖn kü thuËt
- Khoa c«ng nghÖ th«ng tin: §iÖn tö, tin häc
- Khoa c¬ khÝ: C¬ chÕ t¹o, ®éng lùc, söa ch÷a
- Khoa NhiÖt: NhiÖt l¹nh
- Khoa x©y dùng d©n dông c«ng nghiÖp (X1)
- Khoa x©y dùng thuû lîi - thuû ®iÖn (X2)
- Khoa x©y dùng cÇu ®êng (X3)
Trong mçi ngµnh l¹i cã nhiÒu líp vµ mçi líp ®îc ®Æt mét tªn kh¸c nhau. VÝ dô nh: 95T, 96T1, 96T2, 95X1A, 95X1B . . .
C¸c khoa kh«ng qu¶n lý sinh viªn: c¸c khoa nµy chØ qu¶n lý gi¸o viªn gi¶ng d¹y mµ kh«ng qu¶n lý sinh viªn.
- Khoa c¬ b¶n: to¸n, lý, ho¸
- Khoa M¸c- Lªnin
- Khoa gi¸o dôc thÓ chÊt
- Khoa ngo¹i ng÷
- Khoa c¬ së kü thuËt
Víi mçi ngµnh cã mét sè c¸c häc phÇn kh¸c nhau mµ sinh viªn ngµnh ®ã cÇn ph¶i ®¹t ®Ó tèt nghiÖp.
Tuú theo ngµnh chuyªn m«n trong c¸c khoa mµ sinh viªn cã nh÷ng m«n häc kh¸c nhau. Víi mçi m«n häc cã nh÷ng th«ng tin liªn quan nh: tªn m«n häc, sè ®¬n vÞ häc tr×nh, gi¸o viªn d¹y hay híng dÉn.
Cuèi mçi häc kú, ph¶i cho sinh viªn thi hÕt m«n hay lµm ®Ò tµi m«n häc vµ b¸o c¸o kÕt qu¶ cho bé hËn gi¸o vô khoa gåm c¸c th«ng tin sau: hä tªn sinh viªn, sè thÎ, m«n thi, lÇn thi, ngµy thi, ®iÓm.
KÕt qu¶ thi mçi m«n häc cña sinh viªn nÕu tõ 5 trë lªn ®îc xem nh lµ ®¹t nÕu kh«ng th× ph¶i thi l¹i. Sau khi kÕt thóc m«n häc sinh viªn chØ ®îc quyÒn thi hai lÇn, nÕu c¶ hai lÇn thi ®iÓm ®Òu kh«ng ®¹t, sinh viªn cã thÓ ®¨ng ký ®Ó häc l¹i m«n ®ã vµ l¹i cã quyÒn thi thªm hai lÇn.
Cuèi mçi häc kú, bé phËn gi¸o vô khoa sÏ tËp hîp kÕt qu¶ thi cña tõng líp, in vµ c«ng bè cho sinh viªn ®îc râ, sau ®ã göi vÒ cho phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ. Phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ lu tr÷ c¸c th«ng tin nµy ®Ó xÐt t c¸ch lªn líp, nhËn ®Ò tµi tèt nghiÖp, c«ng nhËn tèt nghiÖp.
Cuèi mçi n¨m häc, phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ sÏ xÐt kÕt qu¶ häc tËp cña sinh viªn trong n¨m ®ã vµ c«ng bè danh s¸ch sinh viªn lu ban, ra trêng vÜnh viÔn.
Mçi sinh viªn tho¶ m·n ®iÒu kiÖn sau th× ®îc lªn líp, ngîc l¹i th× lu ban hoÆc ra trêng vÜnh viÔn nÕu ®· lu ban mét lÇn (tøc lµ mçi sinh viªn chØ ®îc lu ban mét lÇn trong suèt 5 n¨m häc) hay ®iÓm trung b×nh c¶ n¨m £ 4.00.
- §iÓm trung b×nh c¶ n¨m ³ 5.00
- Tæng sè ®¬n vÞ häc tr×nh ®¹t ³ 2/3 sè ®¬n vÞ häc tr×nh häc
§èi víi sinh viªn n¨m cuèi th× phßng ®µo t¹o vµ c«ng t¸c chÝnh trÞ ph¶i xÐt t c¸ch nhËn ®Ò tµi tèt nghiÖp, vµ xÐt c«ng nhËn tèt nghiÖp. §iÒu kiÖn tèt nghiÖp cña sinh viªn nh sau:
- §iÓm trung b×nh c¶ 5 n¨m häc ³ 5.00
- Kh«ng cã m«n nµo cã ®iÓm £ 3 ®iÓm
- Sè häc phÇn kh«ng ®¹t £ 10% tæng sè häc phÇn
II.2 S¬ ®å dßng d÷ liÖu
Tõ kÕt qu¶ kh¶o s¸t hÖ thèng ë trªn, nghiªn cøu hå s¬ néi bé vµ c¸c dßng lu©n chuyÓn th«ng tin. Ta lËp ra s¬ dßng d÷ liÖu cho biÕt sù trao ®«it d÷ liÖu gi÷a c¸c bé phËn cña hÖ thèng nh sau:
§iÓm thi
Sinh viªn
GVô khoa (cã QLSV)
Phßng gi¸o vô
Ban gi¸m hiÖu
GVô khoa (kh«ng QLSV)
Danh s¸ch SV TN ®· duyÖt
Danh s¸ch
SVTN
Danh s¸ch SV TN ®· duyÖt
KÕt qu¶ häc tËp c¶ n¨m
KÕt qu¶ thi 1 häc kú
Th«ng tin vÒ sinh viªn míi
B¶ng ®iÓm TN
KÕt qu¶ häc tËp
Th«ng tin nhËp häc
Danh s¸ch SV TN ®· duyÖt
Danh s¸ch SV lu ban
NhËn sinh viªn míi
Tõ s¬ ®å lu©n chuyÓn c¸c dßng th«ng tin, x©y dùng b¶ng c¸c dßnh lµm c¬ së cho viÖc ph©n tÝch d÷ liÖu vµ sö lý tiÕp theo. B¶ng gåm c¸c dßng, d÷ liÖu th«, c¸c v¨n b¶n, hay th«ng tin chøa d÷ liÖu th« ®ã vµ nguån ®Ých cña c¸c dßng.
B¶ng c¸c dßng d÷ liÖu
STT
Tªn dßng
D÷ liÖu
Nguån -> §Ých
1
Th«ng tin nhËp häc
Hä tªn SV
Ngµy sinh
N¬i sinh
Khoa
Ngµnh
Sinh Viªn
Phßng gi¸o vô
2
Th«ng tin sinh viªn míi
Hä tªn SV
Ngµy sinh
N¬i sinh
Khoa
Ngµnh
Sè thÎ
Líp
Phßng gi¸o vô
Gi¸o vô khoa
3
NhËn sinh viªn míi
Sè thÎ
Líp
Gi¸o vô khoa
Sinh viªn
4
KÕt qu¶ thi cña c¸c khoa kh«ng QLSV
Sè thÎ
Hä tªn SV
Líp
TªnMH
§iÓm
Khoa kh«ng QLSV
Gi¸o vô khoa cã QLVS
5
KÕt qu¶ thi 1 häc kú
Sè thÎ
Hä tªn SV
Líp
TªnMH
Sè häc tr×nh
§iÓmMH
§tbHkú
Gi¸o vô khoa
Phßng gi¸o vô
6
KÕt qu¶ häc tËp c¶ n¨m
Sè thÎ
Hä tªn SV
Líp
§tbHkúI
§tbHkúII
§tbN¨m
Gi¸o vô khoa
Phßng gi¸o vô
7
Danh s¸ch SV lu ban
Sè thÎ
Hä tªn SV
Líp
8
Danh s¸ch SV tèt nghiÖp (SVTN)
Sè thÎ
Hä tªn SV
Líp
9
Danh s¸ch SVTN ®· duyÖt
Sè thÎ
Hä tªn SV
Líp
10
B¶ng ®iÓm tèt nghiÖp
Hä tªn SV
Khoa
Ngµnh
Líp
TªnMH
Sè häc tr×nh
§iÓm
Tæng häc tr×nh
Sè häc tr×nh ®¹t
XÕp lo¹i
II.3 Tõ ®iÓn d÷ liÖu
C¸c d÷ liÖu th« sau khi ®îc thanh läc, lo¹i bá c¸c trêng hîp d÷ liÖu nhiÒu nghÜa, d÷ liÖu ®ång nghÜa ta h×nh thµnh tö ®iÓn d÷ liÖu sau:
STT
D÷ liÖu
Lo¹i
M« t¶
Quy t¾c qu¶n lý
1
Sè thÎ
KTT
C
2
Hä tªn SV
KTT
C
3
Ngµy sinh
KTT
D
4
N¬i sinh
KTT
C
5
Khoa
KTT
C
6
Líp
KTT
C
7
Ngµnh
KTT
C
8
M·khoa
KTT
C
9
M·ngµnh
KTT
C
10
SèHtr×nh
TT
N
11
M·MH
KTT
C
12
§iÓmMH
KTT
N
13
TªnMH
KTT
C
14
§tbHkú
TT
N
15
HätªnGV
KTT
C
16
M·GV
KTT
C
17
TªnHkú
KTT
C
18
SèHkú
KTT
C
19
GiíiTÝnh
KTT
C
20
§tbHkú
TT
N
21
HPHkú
TT
N
22
HPHkú§¹t
TT
N
23
TængHP
TT
N
24
TængHP§¹t
TT
N
25
§tbChung
TT
N
STT: Sè thø tù cña d÷ liÖu
D÷ liÖu: DiÔn gi¶i d÷ liÖu
Lo¹i: TT chØ d÷ liÖu tÝnh to¸n, KTT chØ d÷ liÖu kh«ng tÝnh to¸n
M« t¶: C¸c kiÓu d÷ liÖu
- N : D÷ liÖu kiÓu sè
- C: D÷ liÖu kiÓu ký tù
- D: d÷ liÖu kiÓu ngµy th¸ng
II.4 M« h×nh thùc thÓ kÕt hîp
C¸c thùc thÓ trong hÖ thèng, mçi thùc thÓ gåm tªn thùc thÓ, kho¸ cña nã
NGµNH
M·Ngµnh
Tªnngµnh
KHOA
M·Khoa
TªnKhoa
TrëngKhoa
GVKhoa
Häckú
SèHkú
TªnHkú
Gi¸oviªn
M·GV
TªnGV
D¹yM«n
sinhviªn
SèthÎ
HätªnSV
Ngaysinh
N¬iSinh
Líp
M«nhäc
M·MH
TªnMH
SèHtr×nh
KHOA
M·Khoa
TªnKhoa
TrëngKhoa
GVôKhoa
NGµNH
M·Ngµnh
Tªnngµnh
Häckú
SèHkú
TªnHkú
sinhviªn
SèthÎ
HätªnSV
Ngaysinh
N¬iSinh
Líp
Gi¸oviªn
M·GV
TªnGV
D¹yM«n
M«nhäc
M·MH
TªnMH
SèHtr×nh
CIM
1-n
1-n
§iÓmMH
CIF
1-n
1-n
CIF
1-n
1-1
CIF
1-n
1-1
CIF
1-n
1-n
Bao gåm/
§tbHkú
HPHkú
HPHkú®¹t
TængHP
§tbChung
II.5 M« h×nh nhÞ nguyªn
§Ó ®¬n gi¶n hãa viÖc x©y dùng ch¬ng ch¬ng tr×nh sau nµy, ta chuyÓn m« h×nh thùc thÓ kÕt hîp vÒ d¹ng m« h×nh nhÞ nguyªn b»ng c¸ch thªm hai thùc thÓ.
KHOA
M·Khoa
TªnKhoa
TrëngKhoa
GVôKhoa
NGµNH
M·Ngµnh
Tªnngµnh
Häckú
SèHkú
TªnHkú
sinhviªn
SèthÎ
HätªnSV
Ngaysinh
N¬iSinh
Líp
Gi¸oviªn
M·GV
TªnGV
D¹yM«n
CIF
1-n
1-n
CIF
1-n
1-1
CIF
1-n
1-1
CIF
M«nhäc
M·MH
TªnMH
SèHtr×nh
®iÓm
SèthÎ
M·MH
§iÓmMH
CIF
CIF
1-n
1-1
tængkÕtSèthÎ
SèHkú
§tbHkú
HPHkú
HPHkú®¹t
TængHP
§tbChung
CIF
1-n
1-1
1-1
1-n
1-n
1-n
CIF
1-1
1-n
X©y dùng ch¬ng tr×nh
III.1 Chän c«ng cô
HÖ thèng th«ng tin chóng ta ®· kh¶o s¸t ë trªn chñ yÕu lµ khai th¸c c¬ së d÷ liÖu: cËp nhËt, nhËp míi, t×m kiÕm. C¸c ®éng t¸c xö lý, tÝnh to¸n t¬ng ®èi ®¬n gi¶n. Trªn c¸c hÖ thèng Windows chóng ta cã thÓ chän c¸c hÖ qu¶n trÞ c¬ së d÷ liÖu nh Foxpro, Ms-Access. . . th× c«ng viÖc cña chóng ta sÏ ®îc gi¶i quyÕt mét c¸ch nhanh chãng vµ gän nhÑ..Kh«ng may thay c¸c hÖ qu¶n trÞ c¬ së d÷ liÖu nµy kh«ng vËn hµnh ®îc trªn c¸c hÖ thèng UNIX, LINUX. §©y lµ mét vÊn ®Ò lín cña ®Ò tµi nµy: "kh«ng cã c«ng cô". TÊt nhiªn, trªn c¸c hÖ thèng UNIX, LINUX tån t¹i rÊt nhiÒu c¸c hÖ qu¶n trÞ c¬ së d÷ liÖu nh Oracle, miniSQL, Dbase, Sysbase. . .Nhng c¸c c«ng cô nµy kh«ng ph¶i dÔ cã ®îc do tÝnh th¬ng m¹i cña chóng.
Trong ®Ò tµi nµy t«i ®· chän mét c«ng cô gäi lµ DBM (Database Manager) - mét hÖ thèng th viÖn chuÈn cña UNIX ®Ó lu tr÷ c¸c tÖp c¬ së d÷ liÖu. Víi c¸c tÖp c¬ së d÷ liÖu víi phÇn më réng lµ . DB cã thÓ xö lý ®îc bëi ng«n ng÷ Perl th«ng qua c¸c hµm th viÖn chuÈn trong c¸c th viÖn nh:
GDBM_File.pm-GNU's database interface files
NDBM_File.pm-Berkeley UNIX compatibility
ODBM_File.pm-Standard Perl package
SDBM_File.pm-Standard Perl package
AnyDBM_File.pm-Virtual classes for any of the above database interfaces
§Ó sö dông c¸c th viÖn nµy trong ch¬ng tr×nh Perl chung ta thªm vµo ®Çu ch¬ng tr×nh dßng sau ®©y
uses
VÝ dô: uses AnyDBM_File
Mét tÖp c¬ së d÷ liÖu lu tr÷ theo cÊu tróc mét file DBM gåm hai yÕu tè:
Kho¸ / néi dung
Mçi cÆp Kho¸/néidung t¹o thµnh mét b¶n ghi. §Ó truy cËp ®Õn th«ng tin cña c¸c b¶n ghi chóng ta sö dông c¸c c©u lÖnh Perl. Vidô, ®Ó më tÖp c¬ së d÷liÖu cã tªn sinhvien.db dïng lÖnh sau:
Dbopen(%handle, "sinhvien.db", 0666);
C¸c b¶n ghi trong c¬ së d÷ liÖu lóc nµy ®îc ¸nh x¹ vµo m¶ng b¨m %handle víi Kho¸ lµ lµ chØ môc cña m¶ng b¨m.
III.2 X©y dùng m« h×nh Logic d÷ liÖu
Tõ m« h×nh ý niÖm d÷ liÖu ®· x©y dùng ë trªn vµ dùa vµo cÊu tróc cña file DBM ta tiÕn hµnh x©y dùng m« h×nh logic d÷ liÖu.
Nh ®· nãi ë trªn, file DBM víi cÊu tróc t¹o thµnh c¸c cÆp Kho¸/néidung mçi cÆp nh vËy t¹o nªn mét b¶n ghi. D÷ liÖu cña c¸c b¶n ghi sÏ ®îc lu tr÷ trong phÇn néi dung, c¸c b¶n ghi ®îc ph©n biÖt víi nhau bëi Khãa t¬ng øng cña chóng. C¸c trêng trong mçi b¶n ghi ®îc ph©n biÖt víi nhau bëi mét (hoÆc mét nhãm) ký tù do chóng ta tù chän(ë ®©y t«i ®· chän lµ dÊu " : ").
VÝ dô:
sinhvien.db
m· sinh viªn::Hä lãt: TªnSV:Ngµy sinh:N¬i sinh:Líp
khht.db (kÕ ho¹ch häc tËp)
LípXXKúYY::m«n1:h_tr×nh1:m«n2:h_tr×nh2:m«n3:h_tr×nh3. . .
III.3 C¸c thñ tôc xö lý trong ch¬ng tr×nh
HÖ thèng ch¬ng tr×nh ®îc chia ra nhiÒu module, mçi mçi module t¬ng øng víi mét ch¬ng tr×nh CGI ®éc lËp vµ thùc hiÖn mét nhiÖm vô riªng biÖt. Sau ®©y lµ tãm t¾t nhiÖm vô vµ gi¶i thuËt cña vµi module ®iÓn h×nh trong ch¬ng tr×nh:
1. Module nhËp danh s¸ch líp míi ( nhapds.cgi )
Module chØ cã thÓ ®îc gäi thùc hiÖn khi ngêi sö dông ®¨ng nhËp vµo ch¬ng tr×nh víi username lµ root. Module cã nhiÖm vô t¹o ra mét tËp tin c¬ së d÷ liÖu trªn m¸y chñ lu tr÷ th«ng tin cña sinh viªn mét líp nµo ®ã do ngêi dïng nhËp vµo. NhiÖm vô cña Module ®îc thùc hiÖm qua c¸c bíc sau:
- NhËp username, password
- NÕu username, password ®óng th× nhËp vµo tªn líp míi, nÕu kh«ng th× quay l¹i bíc 1.
- NÕu danh s¸ch líp ®· tån t¹i th× nhËp l¹i tªn líp, nÕu cha chuyÓn qua bíc 4
- NhËp m· sinh viªn, hä tªn, ngµy sinh, quª qu¸n.
- KÕt thóc, nhÊn nót ®ãng cöa sæ tr×nh duyÖt.
Module nhapds.cgi xem phô lôc môc I
2. Module t×m kiÕm sinh viªn ( timkiem.cgi )
Module nµy yªu cÇu ngêi dïng nhËp vµo 3 kho¸ t×m kiÕm: m· sinh viªn, hä lãt, tªn sinh viªn. Ngêi dïng cã thÓ nhËp c¸c kho¸ mét c¸ch tuú ý, vÝ dô cã thÓ chØ cÇn nhËp mét trong 3 th«ng tin trªn. Cã thÓ nhËp c¸c th«ng tin kh«ng ®Çy ®ñ, vÝ dô ë trêng hä lãt nhËp vµo ' N' vµ trêng tªn nhËp vµo ' D ' th× ch¬ng tr×nh sÏ t×m tÊt c¶ nh÷ng ngêi cã hä lãt b¾t ®Çu víi ký tù ' N ' vµ tªn b¾t ®Çu víi ký tù ' D '
Module timkiem.cgi xem phô lôc môc II
3. Module xem danh s¸ch ( xem_danh_sach1.cgi )
Module nµy yªu cÇu ngêi dïng nhËp vµo tªn líp cÇn xem, lÊy th«ng tin nhËp vµo vµ më tËp tin c¬ së d÷ liÖu t¬ng øng vµ cho hiÓn thÞ.
Module xem_danh_sach1.cgi xem phô lôc môc III
4. Module xem ®iÓm ( xem_diem.cgi )
Module nµy yªu cÇu ngêi dïng nhËp vµo tªn mét tªn líp vµ mét häc kú nµo ®ã. Dùa vµo c¸c th«ng tin nhËp vµo module sÏ më c¸c tËp tin c¬ së d÷ liÖu t¬ng øng, thùc hiÖn kÕt nèi gi÷a c¬ së d÷ liÖu sinhvien.db, khht.db, diem.db vµ cho hiÓn thÞ kÕt qu¶ lªn mµn h×nh browser.
Module xem_diem.cgi xem phô lôc môc IV
Ch¬ng V
kÕt qu¶ thùc hiÖn ch¬ng tr×nh
X©y dùng m«i trêng hÖ thèng
HÖ thèng ch¬ng tr×nh "Qu¶n lý sinh viªn trêng §¹i häc kü thuËt" ®îc viÕt b»ng ng«n ng÷ Perl theo c«ng nghÖ CGI trªn hÖ ®iÒu hµnh Linux phiªn b¶n 6.1.Toµn bé ch¬ng tr×nh nguån ®îc ®Æt trong th môc /home/httpd/cgi-bin/database/*.cgi. C¸c tËp tin c¬ së d÷ liÖu ®îc ®Æt trong cïng th môc víi tªn lµ *.db.
Browser ®¨ng nhËp sö dông ch¬ng tr×nh víi quyÒn h¹n cho phÐp cã thÓ t¹o, cËp nhËt söa ch÷a trong c¸c tËp tin c¬ së d÷ liÖu. §Ó lµm ®iÒu nµy chóng ta cÇn ®Æt c¸c thuéc tÝnh cho th môc b»ng lÖnh UNIX sau:
chmod 777 /home/httpd/cgi-bin/database
§Ó hiÖn thùc hÖ thèng ch¬ng tr×nh nµy, cÇn cã mét m¸y Linux server, cã cµi ®Æt Apache Web server. M«i trêng m¹ng víi c¸c m¸y tr¹m cã thÓ lµ m¸y ch¹y Linux, Unix, Win®ows9X, 2000 . . .miÔn lµ cã thÓ ch¹y ®îc c¸c tr×nh duyÖt nh Netscape, Internet Explorer . . .
Ch¹y ch¬ng tr×nh
Bíc 1. T¹i m¸y tr¹m, trong tr×nh duyÖt gâ vµo URL chØ ®Õn Form chÝnh cña ch¬ng tr×nh, cô thÓ nh sau:
Form hiÖn ra nh sau:
Bíc 2. ë bíc nµy, ngêi dïng cã thÓ chän mét trong c¸c nót lÖnh ë pannel bªn tr¸i. Cã thÓ chän c¸c chøc n¨ng nh: NhËp míi danh s¸ch mét líp, nhËp ®iÓm mét häc kú nµo ®ã cho mét líp nµo ®ã, xem danh s¸ch mét líp nµo ®ã, t×m kiÕm th«ng tin, xem kÕt qu¶ häc tËp . . .
Bíc 3. NÕu ngêi dïng chän c¸c môc nh: "NhËp danh s¸ch", "NhËp ®iÓm" th× ch¬ng tr×nh sÏ hái mËt khÈu sö dông. NÕu ®óng, th× míi cã thÓ thùc hiÖn chøc n¨ng chän, nÕu kh«ng th× kh«ng thÓ ch¹y tiÕp.
Bíc 4. KÕt thóc ch¬ng tr×nh, chØ viÖc ®ãng cöa sæ tr×nh duyÖt
Mét sè Form minh häa trong ch¬ng tr×nh
Form chÝnh
Form yªu cÇu mËt khÈu ®¨ng nhËp
Form yªu cÇu ngêi dïng chän tªn líp vµ häc kú nµo ®ã ®Ó nhËp ®iÓm
Form nhËp ®iÓm häc kú I cho sinh viªn líp 95T
Form kÕt qu¶ häc tËp häc kú I cñalíp 95T
Ch¬ng VI
KÕt luËn
Nh÷ng kÕt qu¶ ®¹t ®îc
I.1 Lý thuyÕt
- T×m hiÓu c¸ch cµi ®Æt vµ sö dông hÖ ®iÒu hµnh Linux.
- Sö dông thµnh c«ng phÇn mÒm Apache Server trªn Linux hç trî c¸c øng dông CGI
- HiÓu ®îc c«ng nghÖ CGI vµ c¸ch thøc lËp tr×nh CGI trªn Linux.
- T×m hiÓu giao thøc HTTP vµ c¸c ph¬ng thøc cña nã hç trî lËp tr×nh trªn m¹ng.
- BiÕt c¸ch lËp tr×nh b»ng ng«n ng÷ Perl trong m«i trêng Linux theo c«ng nghÖ CGI phôc vô gi¶i quyÕt bµi to¸n truy cËp c¸c c¬ së dc liÖu trong c¸c bµi to¸n.
I.2 Thùc tiÔn
- HiÖn thùc vµ cµi ®Æt thµnh c«ng hÖ ®iÒu hµnh Linux phiªn b¶n 5.2, 6.1
-X©y dùng ch¬ng tr×nh qu¶n lý sinh viªn ®· ®¸p øng ®îc phÇn lín c¸c yªu cÇu ®Ò ra.
- Ch¬ng tr×nh ®· vËn hµnh thµnh c«ng trªn m¹ng.
- Sö dông ch¬ng tr×nh, c¸c vÞ gi¸o vô cã thÓ nhËp, cËp nhËt ®iÓm cho sinh viªn sau mçi kú thi vÒ phßng mét c¸ch dÔ dµng.
- Gia ®×nh cña sinh viªn ë nhµ chØ cÇn cã m¸y tÝnh kÕt nèi vµo m¹ng th× cã thÓ truy cËp ®Õn ®îc th«ng tin vÒ con c¸i cña m×nh ®ang häc t¹i trêng.
TÝnh kh¶ thi
Nh ý tëng ®· nªu trong ch¬ng ®Çu. Môc ®Ých cña ®Ò tµi nµy mang nhiÒu tÝnh khai th«ng, nghiªn cøu, cha chó träng vµo môc tiªu hiÖn thùc ch¬ng tr×nh trªn thùc tÕ. Tuy nhiªn, ®Ò tµi nµy cã tÝnh kh¶ thi ngay tõ ý tëng "Liªn l¹c gi÷a gia ®×nh vµ nhµ trêng", "Liªn l¹c gi÷a c¸c gi¸o vô khoa víi phßng ®µo t¹o".
§Ó hiÖn thùc ®îc toµn bé ý tëng cña ®Ò tµi, chØ cÇn mét m¸y tÝnh ch¹y Linux kÕt nèi vµo m¹ng Internet, ®îc c«ng nhËn trªn m¹ng vµ ®îc cµi ®Æt ch¬ng tr×nh nµy. Mèi liªn hÖ gi÷a c¸c vÞ gi¸o vô khoa vµ phßng ®µo t¹o chØ cÇn lµ m¹ng côc bé hoÆc Intranet lµ ®îc.
H¹n chÕ
- C¸c thao t¸c sö lý trong ch¬ng tr×nh cßn ®¬n s¬ cha ®¸p øng hÕt nhu cÇu thùc tÕ.
- C«ng cô sö dông ®Ó m« t¶ c¸c c¬ së d÷ liÖu cßn d¬n gi¶n, cha ®¸p øng ®îc c¸c yªu cÇu truy vÊn phóc t¹p.
- Ph©n chia quyÒn h¹n ®èi víi c¸c ®èi tîng sö dông hÖ thèng cha cô thÓ.
Híng ph¸t triÓn
Ng«n ng÷ Perl hoµn toµn cã thÓ thao t¸c víi c¸c hÖ qu¶n trÞ c¬ së d÷ liÖu m¹nh nh Oracle, Sysbase. . . NÕu cã thÓ tæ chøc ®îc c¬ së d÷ liÖu cña ch¬ng tr×nh trªn Oracle th× tÇm vãc cña ch¬ng tr×nh sÏ ®îc n©ng lªn rÊt cao, ®¸p øng ®îc nhiÒu thao t¸c qu¶n lý phøc t¹p.
Ph¸t triÓn c¸c kü thuËt ®· nghiªn cøu, tèi u ho¸ ch¬ng tr×nh vµ tiÕn hµnh hoµn thiÖn c¸c chøc n¨ng ngêi dïng, tÝch hîp thªm vµo ch¬ng tr×nh c¸c dÞch vô t×m nhanh trªn m¹ng. . .
§Ò tµi hoµn toµn cã thÓ ®a vµo øng dông trong thùc tÕ, hiÖn thùc ý tëng cña t¸c gi¶ vµ gióp trêng §¹i häc kü thuËt qu¶n lý sinh viªn trªn m¹ng.
Tµi liÖu tham kh¶o
[1] Kamran Husain and Robert F. Breedlove, Perl 5 Unleashed
[2] David Till, Teach Yourself Perl5 in 21 days
[3] David Harlan, Special Edition Using Perl for Web programming
[4] Jeffry Dwight and Michael Erwin , Special Edition Using CGI
[5] David Medinets, Perl 5 by exxample
[6] Eugene Eric Kim, CGI Developer's Guide
[7] Moscheofl ees Foghlys, Perl 5 Qick Reference
[8] Jonathan Hagey, Programming Perl 5.0 CGI Web Page for Windows NT
[9] Web Programming with Perl5
[10] Eugene Eric Kim, CGI Programming Unleashed
[11] Eric Herrmann,
Teach Yourself CGI Programming with PERL 5 in a Week, 2E
[12] Edward S.Peschko and Michele DeWolfe, Perl 5 Complete
[13] Shishir Gundavaram, CGI Programming on the World Wide Web
[14] Red Hat Software, Inc, The complete Red Hat Linux Installation Guide 5.2
[15] Jack Tackett, Jr. Steve Burnett, Special Edition Using Linux, Fourth Edition
[16] Bill Ball, Stephen Smoogen, Sams' Teach Yourself LINUX in 24 Hours
[17] David Pitts, Linux Unleashed, Second Edition
Phô lôc
Module nhapds.cgi
#!/usr/bin/perl
#nhapds.cgi
require 'cgi-lib.pl';
use AnyDBM_File;
&ReadParse(*input);
print &PrintHeader,&HtmlTop("Quan ly sinh vien");
$db_name="Lop";
$db_name.=$input{'T1'};
$db_lop=$db_name;
dbmopen(%lop,$db_lop,0666);
while(($ma_sv,$info)=each(%lop)){
if ($input{'ma_sv'}==$ma_sv){
print "Ma sinh vien nay da ton tai\n";
print "Nhan Back o trinh duyet de lam lai\n";
print &HtmlBot;
dbmclose(%lop);
die;
last;
}
}
if (defined($input{'ma_sv'})){
if (!defined($lop{$input{'ma_sv'}})){
$lop{$input{'ma_sv'}} = "$input{'ho_lot'}:$input{'ten_sv'}:$input{'n_sinh'}:$input{'d_chi'}";
}
}
dbmclose(%lop);
print <<HTM;
M· sinh viªn
:
Hä lãt:
Tªn sinh
viªn:
Ngay
sinh:
Dia
chi:
HTM
print " ";
print " ";
print " ";
print"";
print "";
print "";
print"Ve trang dau";
print &HtmlBot;
dbmclose(%lop);
Module xemdanhsach.cgi
#!/usr/bin/perl
#xemdanhsach.cgi
require 'cgi-lib.pl';
use AnyDBM_File;
&ReadParse(*input);
print &PrintHeader;
#
if (($input{'R1'} eq 'V1') && ($input{'D1'} eq "Lop95T"))
{print &HtmlTop("Danh s¸ch sinh viªn $input{'D1'}");$db_name=$input{'D1'};&openfile();}
if (($input{'R1'} eq 'V1') && ($input{'D1'} eq "Lop96T1"))
{print &HtmlTop("Danh s¸ch sinh viªn $input{'D1'}");$db_name="Lop96T1";&openfile();}
if (($input{'R1'} eq "V1") && ($input{'D1'} eq "Lop96T2"))
{Print &HtmlTop("Danh s¸ch sinh viªn $input{'D1'}");$db_name="Lop96T2";&openfile();}
if (($input{'R1'} eq "V1") && ($input{'D1'} eq "Lop97T"))
{print &HtmlTop("Danh s¸ch sinh viªn $input{'D1'}");$db_name="Lop97T";&openfile();}
if (($input{'R1'} eq "V1") && ($input{'D1'} eq "Lop98T"))
{print &HtmlTop("Danh s¸ch sinh viªn $input{'D1'}");$db_name="Lop98T";&openfile();}
elsif (($input{'R1'} eq "V1") && ($input{'D1'} eq "Lop99T"))
{print &HtmlTop("Danh s¸ch sinh viªn $input{'D1'}");$db_name="Lop99T";&openfile();}
else {print &HtmlTop();&thoat();}
sub openfile(){
dbmopen(%stocks,$db_name,0666);
$number_of_record=0;
print <<TAB;
M· SV
Hä lãt
Tªn
Ngµy sinh
Quª qu¸n
TAB
while (($key,$info) = sort(each (%stocks))){
@info=split(/:/,$info);
print <<EOP;
$key
$info[0]
$info[1]
$info[2]
$info[3]
EOP
$number_of_record++;
}
print "";
print "Danh s¸ch nµy cã $number_of_record Sinh viªn";
dbmclose(%stocks);
die();
}
sub thoat(){
print "Danh s¸ch líp nµy cha tån t¹i. CÇn nhËp danh s¸ch sinh viªn cho líp nµy.";
print "NhÊn Back ë tr×nh duyÖt ®Ó lµm l¹i hoÆc nhËp danh s¸ch.";
}
print &HtmlBot;
Module xemdiem.cgi
#!/usr/bin/perl
#xemdiem.cgi
require 'cgi-lib.pl';
use AnyDBM_File;
&ReadParse(*input);
print &PrintHeader,&HtmlTop("Ket qua hoc tap Lop $input{'D1'} ky $input{'D2'}");
#
$db_name="Lop";
$db_name.=$input{'D1'};
$db_lop=$db_name;
$db_name.=$input{'D2'};
$db_diem=$db_name;
dbmopen(%lop,$db_lop,0666);
dbmopen(%diem,$db_diem,0666);
dbmopen(%mh,"khht",0666);
while(($key_mh,$ds_mh)=each(%mh)){
if ($key_mh=~ /$input{'D1'}/&&$key_mh=~ /$input{'D2'}/){
@ds_mh=split(/:/,$ds_mh);
print "$key_mh:[@ds_mh]";
}
}
$number_of_record=0;
print "";
print " ";
print " Ma sv";
print " Ho lot";
print " Ten
";
$so_mon_hoc=@ds_mh;
foreach($i=0;$i<$so_mon_hoc;$i++){
print " $ds_mh[$i]";
}
print " ";
$i=0;
while (($key,$info) = each(%lop)){
$temp[$i++]=$key;
}
$size=@temp;
foreach ($i=0;$i<$size-1;$i++){
foreach ($j=$i+1;$j<$size;$j++){
if ($temp[$j]<$temp[$i]){
$tam=$temp[$i];
$temp[$i]=$temp[$j];
$temp[$j]=$tam;
}
}
}
foreach($i=0;$i<$size;$i++){
@info=split(/:/,$lop{$temp[$i]});
@diem=split(/:/,$diem{$temp[$i]});
print " ";
print " $temp[$i]";
print " $info[0]";
print " $info[1]";
foreach($j=0;$j<$so_mon_hoc;$j++){
print "$diem[$j]";
}
print " ";
$number_of_record++;
}
print "";
print "Co so du lieu co $number_of_record ban ghi";
dbmclose(%lop);
dbmclose(%diem);
print $db_name;
dbmclose(%mh);
print &HtmlBot;
Module timkiem.cgi
#!/usr/bin/perl
#timkiem.cgi
require 'cgi-lib.pl';
&ReadParse(*input);
print &PrintHeader;
$dbname="Lop95T";
dbmopen(%handle,$dbname,0666);
@results=();
if(($ma_sv_input = $input{'ma_sv'})&&
($ho_lot_input = $input{'ho_lot'})&&
($ten_input = $input{'ten_sv'})){
$kiemtra=0;
while (($ma_sv,$info)=each(%handle)){
if(($ma_sv_input eq $ma_sv)&&
($info=~/$ho_lot_input/)&&
($info=~/$ten_input/)){
$kiemtra=1;
push(@results,$ma_sv);
&in_ket_qua();
last;}
}#while(1)
}elsif(($ho_lot_input = $input{'ho_lot'})&&
($ten_input = $input{'ten_sv'})){
$kiemtra=0;
while (($ma_sv,$info)=each(%handle)){
if(($info=~/$ho_lot_input/)&&
($info=~/$ten_input/)){
$kiemtra=1;
push(@results,$ma_sv);
}
}#while(2)
&in_ket_qua();
if(!$kiemtra) {&exitnone();}
}#elsif (1)
sub exitnone {
print <<EOE;
Khong tim thay
Can nhap lai thong tin de tim kiem
Go back to the form to try again.
EOE
die;
}
sub in_ket_qua{
print "Ket qua";
print "";
print "Ket qua tim kiem";
foreach $r (@results) {
print "------------------------------------";
@info = split(/:/,$handle{$r});
print "Info: $handle{$r}";
print "Ma_sv: $r";
print "Ho lot: $info[0]";
print "Ten: $info[1]";
print "Ngay sinh: $info[2]";
print "Que quan: $info[3]";
}
}
print <<EOH;
Go back to the form to make another search.
EOH
dbmclose(%handle);
Các file đính kèm theo tài liệu này:
- Lập trình CGI với ngôn ngữ Perl trên Linux.DOC