Lập trình CGI với ngôn ngữ Perl trên Linux

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ỳ.

doc70 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3302 | Lượt tải: 1download
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. Nh­ng 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 l­u 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 l­u tr÷ d­íi d¹ng mét file v¨n b¶n. Cã hai ®iÒu cÇn l­u ý: 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 l­u 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Ó l­u 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 l­u tr÷ theo thø tù liªn tiÕp c¸c x©u chuçi nh­ng 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/perl 2 $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 \n BEEP! some blank LINES HERE Today 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 l­u 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Ï l­u 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, nh­ng 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Þ l­u 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 l­u 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× l­u ban hoÆc ra tr­êng vÜnh viÔn nÕu ®· l­u ban mét lÇn (tøc lµ mçi sinh viªn chØ ®­îc l­u 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 l­u 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 l­u 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. . .Nh­ng 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 ®Ó l­u 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 l­u 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 l­u 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ñ l­u 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 ch­a 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ë d­c 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, ch­a 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¬ ch­a ®¸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, ch­a ®¸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 ch­a 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 ch­a 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:

  • docLập trình CGI với ngôn ngữ Perl trên Linux.DOC