Learning Perl - Giới thiệu qua về Perl part 1
lượt xem 48
download
Diễn đàn tin học | Tutorial Room Mục lục »» Chương 2 Learning Perl - Chương 1: Giới thiệu qua về Perl 1. 2. 3. 4. 5. 6. 7. Lịch sử của Perl Mục đích của Perl Tính sẵn có Hỗ trợ (nếu c ó khúc mắc ) Các khái niệm căn bản Sơ qua về Perl Bài tập 1.1 Lịch sử Perl PERL là c ách viết tắt c ho “Prac tical Extrac tion and Report Language”, mặc dù còn được gọi là “Pathologic ally Ec lec tic Rubbish Lister". Larry Wall đã tạo ra Perl khi c ố gắng sản xuất...
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Learning Perl - Giới thiệu qua về Perl part 1
- D iễn đàn tin học | Tutorial Room Mục lục »» C hương 2 Learning Perl - Chương 1: Giới thiệu qua về Perl 1. Lịch sử của Perl 2. Mục đích của Perl 3. T ính s ẵn có 4. Hỗ t rợ (nếu c ó khúc mắc ) 5. Các khái niệm căn bản 6. Sơ qua về Perl 7. Bài t ập 1.1 Lịch sử Perl PERL là c ách viết tắt c ho “Prac tical Extrac tion and Report Language”, mặc dù còn được gọi là “Pathologic ally Ec lec tic Rubbish Lister". Larry Wall đã tạo ra Perl khi c ố gắng sản xuất ra một số báo cáo từ một c ấp bậc c ác tệp kiểu như thư người dùng mạng Usenet về hệ thống báo lỗi, và lệnh awk..và đưa ra bản đầu tiên của Perl. Sau đó Larry đưa nó c ho c ác độc giả Usenet, thường vẫn được gọi là “the Net”. Kết quả là Perl phát triển dần và c ũng c ùng tỉ lệ như kernel c ủa UNIX. Nó đã phát triển c ác tính năng và tính khả c huyển. Larry sẽ đưa ra bản Perl mới nhất, bản 5.0, chắc c hắn sẽ c ó một số tính năng t hường hay được yêu cầu, và được thiết kế lại từ bên trong trở ra. Tuy nhiên, c uốn sác h này đã được thử với Perl bản 4.0. Mọi thứ ở đây đều sẽ làm việc với bản 5.0 và c ác bản sau c ủa Perl. Trong thực tế, c hương trình Perl 1.0 vẫn làm v iệc tốt với những bản gần đây, ngoại trừ một vài thay đổi khác c ần c ho sự nâng c ấp. 1.2 Mục đích của Perl Perl được thiết kế để t rợ giúp c ho người dùng UNIX với những nhiệm vụ thông dụng mà có thể rất nhậy cảm với tính khả c huyển đối với trình shell, vì nó ngắn hơn và không phức tạp như các ngôn ngữ lập trinh C hay một ngôn ngữ công c ụ UNIX nào khác . Khi đã quen thuộc với Perl, bạn sẽ mất ít thời gian để lấy được các tríc h dẫn dòng lệnh shell (hay khai báo C), và mất ít thời gian để lập trình vì Perl là một c ông cụ trợ giúp tuyệt vời. Các c ấu trúc c hặt chẽ của Perl c ho phép tạo ra một số giải pháp với những công c ụ mang tính tổng quát. Cũng vậy, bạn c ó thể lấy những c ông c ụ này sang c ông việc tiếp, vì Perl c ó tính khả chuyển cao và lại có sẵn trên hầu hết c ác hệ thống. Giống như mọi ngôn ngữ khác , Perl c ó thể “c hỉ viết” - tức là c ó thể viết ra c hương trình cho máy hiểu mà c on người không thể "đọc hiểu" được. Nhưng nếu c hú ý c ẩn thận, bạn c ó thể tránh được điều này. Thật vậy, đôi khi Perl trông như khó với những ai không quen, nhưng với người lập trình đã thạo Perl, nó cũng... khá dễ (???). Nếu bạn làm theo những hướng dẫn trong c uốn sác h này thì c hương trình c ủa bạn sẽ dễ đọc, dễ bảo trì và nâng cấp. 1.3 Tính sẵn có Nếu bạn nhận được một lỗi nhỏ: Perl: not found khi bạn thử gọi Perl từ dòng lệnh shell thì điều đó có nghĩa là Perl c hưa được c ài đặt trên hệ thống c ủa bạn. Nhưng bạn hoàn toàn có thể lấy được Perl miễn phí vài c ài vào hệ thốgn c ủa mình. Perl được phân phối theo Giấy phép Công cộng GNU (GNU Public Lic ense), nghĩa là bạn c ó thể phân phát bản binary của Perl với điều kiện là phải kèm theo mã ngồn miễn phí; và nếu bạn sửa đổi Perl thep ý bạn bạn cũng phải phân phối mã nguồn c ủa phần mà bạn sửa đổi. Bạn c ó thể lấy mã nguồn của Perl hoàn toàn miễn phí qua đường download mà c hỉ tốn vài MB để lưu trữ và một khoảng thời gian để tải xuống. Trong thực tế, nó không c hỉ là miễn phí mà nó c hạy c òn gọn hơn trên gần như mọi thứ mà c ó thể gọi là UNIX hay tựa UNIX và c ó trình biên dịc h C. Đó là vì là Perl c ó 1 phần được gọi là "Cấu hình" sẽ c ó nhiệm vụ gọi vào c ác danh mục hệ t hống để tìm những thứ nó c ần, và điều chỉnh việc đưa vào các tệp và các kí hiệu được xác định tương ứng, và c uối c ùng nó sẽ c huyển c ho bạn việc kiểm c hứng phát hiện của nó.
- Bên c ạnh c ác hệ thống UNIX hay tựa UNIX, c ác "tín đồ" của Perl đã đem nó sang Amiga, Atari ST, họ Mac intosh, VMS, OS/2, thậm c hí MS/DOS, Windows - và c ó lẽ c òn nhiều hơn nữa khi bạn đang đọc những dòng chữ này. Vị trí c hính xác và sự c ó sẵn c ủa những bản Perl này thì biến động, c ho nên phải hỏi trên nhóm tin Usenet c hẳng hạn để có được thông tin mới nhất. Nếu bạn là một newbie, thì một bản c ũ c ủa Perl đã c ó trên đĩa phần mềm CD-ROM UNIX Power Tools, c ủa Jerry Peek, Tim O’Reilly và Mike Loukides (O’Reilly & Assoc iates/ Random House Co., 1993), hoặc bạn có thể tìm và download ở http://www.perl.org/. 1.4 Hỗ trợ (nếu như có khúc mắc) Bạn c ó thể liên hệ trực tiếp với Larry hoặc nhóm hỗ trợ Perl trực tuyến toàn thế giới, liên lạc thông qua nhóm tin Usenet c omp.lang.perl. hoặc gửi yêu c ầu tới perl-users-request@virgina.edu. Bên c ạnh nhóm tin, bạn c ũng nên đọc tạp c hí Perl, đi c ùng việc phân phối Perl. Một nguồn có thẩm quyền khác là c uốn sác h Programming Perl c ủa Larry Wall và Randal L. Schwatrz (O’Reilly & Associaté, 1990). 1.5 Các khái niệm cơ bản về Perl Một kịc h bản shell là một dãy các lệnh shell đưa vào trong một tệp văn bản. Tệp này c hạy bằng c ách bật một bit thực hiện (qua c hmod +x filename) rồi gõ tên c ủa tệp đó tại dấu nhắc c ủa shell. Chẳng hạn, một kịch bản shell để c hạy lệnh date v à sau đó là lệnh w ho sẽ được v iết như sau: $ echo date > somecript $ echo who >> somecript $ cat somescript date who $ chmod +x somescript $ somescript [output of date followed by who] $ Tương tự, một c hương trình Perl là một bó c ác c âu lệnh và định nghĩa Perl được đưa vào trong một tệp. Rồi bạn bật bit thực hiện và gõ tên c ủa tệp này tại lời nhắc c ủa vỏ. Tuy nhiên, tệp này phải c hỉ ra rằng đây là một c hương trình Perl và không phải là c hương trình shell, nên c húng ta cần một bước phụ: đặt #!/usr/bin/perl làm dòng đầu tiên c ủa tệp này. Nhưng nếu Perl c ủa bạn được c ài vào nơi không chuẩn (không phải là /usr/bin), hay hệ thống tựa UNIX của bạn không hiểu dòng #! , thì...bạn hỏi người quản trị hệ thống c ủa bạn để được giúp đỡ. Các thí dụ trong sác h này giả sử rằng hệ thống c ủa bạn đã được c ài đặt Perl vào /usr/bin. Perl là một ngôn ngữ phi định dạng kiểu như C - khoảng trắng giữa c ác phần tử c ủa c hương trình là tuỳ chọn, trừ phi hai phần tử của c hương trình dính liền với nhau c ó thể bị lầm lẫn thành một c ái khác , trong trường hợp đó thì khoảng trắng t huộc loại nào đó là bắt buộc (Khoảng trắng bao gồm dấu c ác h, dấu tab, xuống dòng, về đầu dòng hay sang trang mới). Có một vài c ấu trúc đòi hỏi một loại khoảng trắng nào đó ở c hỗ nào đó, nhưng đừng lo, tài liệu sẽ c hỉ rõ cho bạn biết là các khoảng trắng phải được đặt như thế nào với số lượng bao nhiêu. Có thể giả t hiết rằng loại và số lượng khoảng trắng giữa các phần tử trong c hương trình là t uỳ ý trong c ác trường hợp khác . Mặc dù gần như tất c ả c ác chương trình Perl đều c ó thể được viết tất cả trên một dòng, nhưng một chương trình Perl điển hình được viết xuống dòng và c anh lề như c hương trình C, với những phần câu lệnh lồng nhau được viết vào sâu hơn một c hút chẳng hạn, sẽ làm c ho chương trình của bạn dễ nhìn và dễ hiểu hơn. Cũng giống như một kịch bản shell, chương trình Perl bao gồm tất c ả c ác c âu lệnh perl về tệp được lấy tổ hợp c hung như một trình lớn c ần thực hiện. Không có khái niệm về hàm c hính m ain như trong C. Chú thích của Perl giống như chú thíc h c ủa kịc h bản shell: bất kì c ái gì nằm giữa một dấu # t ới cuối dòng đều là một c hú thíc h. Perl không c ó c hú thíc h trên nhiều dòng như C. Không giống hầu hết c ác shell (nhưng giống như awk v à sed), bộ t hông dịc h Perl phân tíc h và biên dịc h hoàn toàn c hương trình trước khi thực hiện nó. Điều này c ó nghĩa là bạn không bao giờ nhận được lỗi
- hoàn toàn c hương trình trước khi thực hiện nó. Điều này c ó nghĩa là bạn không bao giờ nhận được lỗi cú pháp từ c hương t rình một khi c hương trình đã bắt đầu chạy, và c ũng c ó nghĩa là khoảng trắng và chú thíc h sẽ được lược bỏ mất và sẽ không làm c hậm c hương trình. Trong thực tế, giai đoạn biên dịch này bảo đảm việc thực hiện nhanh c hóng c ủa c ác thao tác Perl một khi nó được bắt đầu, và nó cung cấp động c ơ phụ để loại bỏ C như một ngôn ngữ tiện ích hệ thống nhất đơn thuần dựa trên nền tảng là C được c oi là trình biên dịc h. Việc biên dịc h này khá tiêu tốn thời gian. Và sẽ là phi hiệu quả nếu một c hương trình Perl lớn lại chỉ thực hiện một nhiệm vụ nhỏ bé (trong số nhiều nhiệm vụ tiềm năng) và rồi thoát, vì thời gian c hạy c ho chương trình sẽ "nhỏ xíu" nếu so với thời gian biên dịc h. Cho nên Perl giống như một bộ biên dịch và thông dịc h. Nó là biên dịc h vì c hương trình được đọc và phân tíc h hoàn toàn trước khi c âu lệnh đầu tiên được t hực hiện. Nó là bộ thông dịc h vì không c ó mã đíc h chiếm không gian đĩa. Hiểu t heo một c ách nào đó, nó là tốt nhất c ho c ả hai loại này. 1.6 Sơ lược về Perl Sau đây sẽ giới thiệu một số c ác tính năng khác nhau bằng c ác h bổ sung vào một ứng dụng nhỏ. Giải thíc h ở đây ngắn gọn - mỗi vùng chủ đề đều được thảo luận chi tiết hơn nhiều về s au trong c uốn sách này. Nhưng việc "xem qua" này sẽ c ho bạn kinh nghiệm nhanh c hóng về ngôn ngữ. 1.6.1 Chương trình “Hello” Ta hãy nhìn vào một chương trình nhỏ sau: #!/usr/bin/perl print "Hello!\n"; Dòng đầu tiên báo đây là c hương trình Perl. Nó c ũng là lời c hú thíc h c ho Perl c ho tới cuối dòng, giống như hầu hết các kịc h bản shell hay awk. Dòng thứ hai là toàn bộ phần thực hiện được của chương trình này. Tại đây c húng t a thấy c âu lệnh print . Hàm print bắt đầu c hương trình, và nó c ó một đối số là một xâu v ăn bản kiểu C. Bên trong xâu này, tổ hợp kí tự \n biểu thị c ho kí tự dòng mới. Giống như trong C, tất c ả c ác c âu lệnh đơn giản đều kết thúc bằng dấu chấm phảy (; ). Khi bạn gọi chương trình này, phần kernel sẽ gọi bộ thông dịc h Perl, phân t ích toàn bộ c hương trình (hai dòng, kể cả dòng c hú thích đầu tiên) và thực hiện dạng đã dịc h. Thao tác đầu tiên và duy nhất là thực hiện hàm print . Sau khi chương trình đã hoàn tất, thì tiến trình Perl sẽ trả về một mã cho shell để báo rằng c hương trình đã kết thúc . 1.6.2 Hỏi câu hỏi và nhớ kết quả Ta hãy viết lại c hương trình ở trên một chút, thay vì Hello trống không, c hương trình sẽ c hào tên người nhập vào từ bàn phím. Để làm việc này, ta c ần một c hỗ lưu giữ tên, một c ác h hỏi tên, và một c ác h nhận c âu trả lời. Để đặt c hỗ giữ giá trị (VD: tên) ta dùng biến vô hướng. Với c hương trình này, t a sẽ dùng biến vô hướng $name để giữ tên (xem c hi t iết trong c hương sau: Dữ liệu vô hướng, về những gì mà biến này có thể giữ, và những gì c ó thể làm với c húng). Bây giờ, giả sử rằng bạn c ó thể giữ một số hay một xâu (dãy các kí t ự) trong biến vô hướng. Chương trình này c ần hỏi về tên. Để làm điều đó, ta c ần một c ác h nhắc và một c ác h nhận vào. Chương trình trước đã c hỉ ra c ho ta c ách nhắc - dùng hàm print . Và để nhận một dòng từ thiết bị cuối ta dùng toán tử . Ta dữ liệu nhập vào c ho biến $name: print "Ten ban la gi? "; $name = ; Giá trị của $name t ại điểm này c ó một ký tự xuống dòng ở c uối (vì bạn phải nhấn Enter để kết thúc việc nhập tên). Để bỏ qua kí tự đó, chúng ta dùng hàm c hop(). Hàm này lấy một biến vô hướng làm đối số duy nhất và bỏ đi ký tự c uối từ giá trị xâu c ủa biến: chop($name);
- Sau đó in ra c âu c hào: print "Xin chao ban $name"; Và ta có chương trình hoàn c hỉnh: #!/usr/bin/perl print "Ten ban la gi? "; $name = ; chop($name); print "Xin chao ban $name!\n"; 1.6.3 Bổ sung chọn lựa Bây giờ ta muốn c ó một lời c hào đặc biệt c ho Jenny, nhưng muốn lời chào thông t hường c ho mọi người khác . Để làm điều này, ta cần so sánh tên đã được đưa vào v ới xâu Jenny, và nếu hai xâu trùng khớp, thì làm điều gì đó đặc biệt. Ta hãy bổ s ung thêm lệnh if-then-else v à phép so sánh vào c hương trình: #!/usr/bin/perl print "Ten ban la gi? "; $name = ; chop($name); if ($name eq "Jenny") { #chao Jenny print "Chao Jenny! Lam bai tap di chu!\n"; } else { #chao binh thuong print "Xin chao ban $name!\n"; } Toán tử eq s o sánh hai xâu. Nếu bằng nhau (từng kí t ự một, và c ó c ùng c hiều dài) kết quả sẽ là T rue, ngược lại sẽ là False. Câu lệnh if c họn xem "khối" câu lệnh nào so sánh đúng được thực hiện - nếu biểu thức ($name eq "Jenny") là True, khối c hưa c âu lệnh print "Chao Jenny! Lam bai tap di c hu!\n"; sẽ được thực hiện, c òn trong trường hợp ngược lại sẽ là khối c hưa c âu lệnh print "Xin c hao ban $name!\n";. 1.6.4 Đoán từ bí mật Để một người c hạy chương trình đoán một từ bí mật. Với mọi người trừ Jenny, t a hãy để c ho c ho chương trình cứ hỏi lặp lại để đoán đến khi nào người này đoán được đúng. Hãy xem c hương trình sau: #!/usr/bin/perl $secretword = "Jenny"; #tu bi mat print "Ten ban la gi? "; $name = ; chop($name); if ($name eq "Jenny") { print "Chao Jenny! Lam bai tap di chu!\n"; } else { print "Xin chao ban $name!\n"; print "Ban thu doan xem toi ten la gi? "; $guess = ; chop($guess); while ($guess ne $secretword) { print "Sai roi, doan lai di"; $guess = ; chop($guess); } }
- T rước hết, ta định nghĩa tên c ần đoán bằng việc đặt nó vào trong biến vô hướng khác , $sec retword. Sau khi đón c hào, một người (không phải Jenny ) sẽ được yêu c ầu (với một c âu lệnh print khác ) đoán chữ. Lời đoán được đem ra so sánh với từ c ần đoán bằng việc dùng toán tử ne, mà sẽ c ho True nếu các xâu này không bằng nhau (ne là toán tử ngược với toán tử eq). Kết quả c ủa việc so sánh sẽ kiểm soát w hile, chu trình này thực hiện khi việc so sánh vẫn c òn T rue. 1.6.5 Nhiều từ bí mật Ta hãy xem c ách thức mình có thể sửa đổi đoạn c hương trình này để c ho phép c ó nhiều từ bí mật. Bằng việc dùng điều ta đã thấy, c húng ta có thể so sánh lời đoán lặp đi lặp lại theo một c huỗi c âu trả lời rõ được c ất giữ trong c ác biến vô hướng tác h biệt. Tuy nhiên, một danh sách như vậy sẽ khó mà thay đổi hay đọc vào t ừ một tệp hay thiết bị khác . Một giải pháp tốt hơn là c ất giữ tất c ả c ác câu trả lời c ó thể vào trong một c ấu trúc dữ liệu gọi là danh sác h hay mảng. Mỗi phần tử của mảng đều là một biến v ô hướng tác h biệt mà c ó thể được đặt giá trị hay truy cập độc lập. Toàn bộ mảng c ũng c ó thể được trao cho một giá trị để ta c ó thể "truy nhập" vào. Ta có thể gán một giá trị c ho toàn bộ mảng c ó tên @words sao c ho nó c hứa ba mật hiệu: @words =("littlecat", "smalldog", "bigmouse"); Tên biến mảng bắt đầu với @, cho nên c húng là khác biệt với c ác tên biến vô hướng. Một khi mảng đã được gán thì ta c ó thể truy c ập đến từng phần tử bằng c ác h dùng một tham khảo c hỉ số. Cho nên $words[0] là littlec at , $words[1] là smalldog, $words[2] là bigmouse. Chỉ số c ũng c ó thể là một biểu thức , c ho nên nếu ta đặt $i là 2 t hì $words[$i] là bigmouse. (Tham khảo c hỉ số bắt đầu với $ t hay vì @ là do c húng tham khảo tới một phần tử riêng c ủa mảng thay vì toàn bộ mảng). Quay trở lại với thí dụ trước đây c ủa ta: #!/usr/bin/perl #cac tu bi mat @words = ("littlecat", "smalldog", "bigmouse"); print "Ten ban la gi? "; $name = ; chop($name); if ($name eq "Jenny") { print "Chao Jenny! Lam bai tap di chu!\n"; } else { print "Xin chao ban $name!\n"; print "Tu bi mat la gi"; $guess = ; chop($guess); $i = 0; #thu truoc 1 tu $correct = "co the"; #tu nay co doan dung hay khong? ($correct eq "co the") { #cu kiem tra den khi het while if ($words[$i] eq $guess) { $correct = "co"; #dung roi } elsif ($i < 2) { $i = $i + 1; #xet tu tiep theo } else { print "Sai roi, thu lai di. Tu bi mat ma gi? "; $guess = ; chop($guess); $i = 0; #kiem tra lai tu dau 1 lan nua } } #key thuc cua while ($correct eq "co the") } #Ket thuc cua "not Jenny" Chú ý rằng chúng ta đang dùng biến vô hướng $c orrect để c hỉ ra rằng chúng ta vẫn đang tìm ra mật hiệu đúng, hoặc c húng ta không tìm thấy. Chương trình này c ũng giới thiệu khối elsif c ủa câu lệnh if-
- t hen-else. Không c ó lệnh nào tương đương như thế trong C hay awk - đó là việc viết tắt c ủa else và theo sau là một if mới nhưng không lồng trong c ặp dấu () khác. Đây chính là cái rất giống Perl để so sánh một tập c ác điều kiện trong việc phân tầng if-elsif-elsif-elsif-else. 1.6.6 Cho mỗi người một từ bí mật khác nhau Trong c hương trình trước, bất kì người nào tới c ũng đều c ó thể đoán bất kì từ nào trong ba từ này và có thể thành c ông. Nếu ta muốn từ bí mật là khác nhau cho mỗi người, thì ta c ần một bảng so sánh giữa người và từ: Người Từ bí mật Chip littlec at Dale smalldog Tom bigmouse Jerry bigmouse Chú ý rằng Jerry và T om c ó chung từ bí mật là bigmouse; điều này hoàn toàn hợp lệ. Các h dễ nhất để c ất giữ một bảng như thế trong Perl là bằng một "mảng băm" (hash array). Mỗi phần tử c ủa mảng này giữ một giá trị vô hướng tách biệt (giống như kiểu mảng khác ), nhưng c ác mảng lại được tham khảo theo khoá, c ó thể là bất kì giá trị vô hướng nào (bất kì xâu hay số, kể c ả số không nguyên và giá trị âm). Để tạo ra một mảng băm %words (c hú ý % không phải là @) với khoá và giá trị được cho trong bảng trên, ta gán một giá trị c ho %words (như ta đã làm nhiều trước đây với mảng khác ): %words = ( "Chip" , "littlecat", "Dale" , "smalldog", "Tom" , "bigmouse", "Jerry", "bigmouse" ); Mỗi c ặp giá trị trong danh sác h đều biểu thị c ho một khoá và giá trị tương ứ ng của nó trong mảng băm. Chú ý rằng ta đã chia phép gán này ra 4 dòng mà không c ó bất kì loại kí tự nối dòng nào, vì khoảng trắng giữa c ác phần tử c hương trình nói c hung là vô nghĩa trong Perl. Để tìm ra từ bí mật c ho T om , ta c ần dùng T om như khoá trong một t ham khảo vào mảng kết hợp %words, qua một biểu thức nào đó như $words{"Tom"}. Giá trị của tham khảo này là bigmouse, tương tự như điều ta đã làm trước đây với mảng khác. Cũng như trước đây, khoá c ó thể là bất kì biểu thức nào, c ho nên gán $person bằng T om và $words{$person} c ũng sẽ trả về giá trị bigmouse. Chương trình hoàn c hỉnh như sau: #!/usr/bin/perl %words = ( "Chip" , "littlecat", "Dale" , "smalldog", "Tom" , "bigmouse", "Jerry", "bigmouse" ); print "Ten ban la gi? "; $name = ; chop($name); if ($name eq "Jenny") { print "Chao Jenny! Lam bai tap di chu!\n"; } else { print "Xin chao ban $name!\n"; #chao thuong thuong $secretword = $words{$name}; #lay tu bi mat print "Tu bi mat la gi? "; $guess = ;
CÓ THỂ BẠN MUỐN DOWNLOAD
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn