1. Trang chủ
  2. » Giáo Dục - Đào Tạo

10 0 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 465,25 KB

Nội dung

ĐẠI HỌC SƯ PHẠM THÀNH PHỐ HỒ CHÍ MINH PERL DÀNH CHO NGƯỜI MỚI HỌC HCM - 2010 Diễn đàn tin học | Tutorial Room Mục lục »» Chương Learning Perl - Chương 1: Giới thiệu qua Perl Lịch sử Perl Mục đích Perl Tính sẵn có Hỗ trợ (nếu có khúc mắc) Các khái niệm Sơ qua Perl Bài tập 1.1 Lịch sử Perl PERL cách viết tắt cho “Practical Extraction and Report Language”, gọi “Pathologically Eclectic Rubbish Lister" Larry Wall tạo Perl cố gắng sản xuất số báo cáo từ cấp bậc tệp kiểu thư người dùng mạng Usenet hệ thống báo lỗi, lệnh awk đưa Perl Sau Larry đưa cho độc giả Usenet, thường gọi “the Net” Kết Perl phát triển dần tỉ lệ kernel UNIX Nó phát triển tính tính khả chuyển Larry đưa Perl nhất, 5.0, chắn có số tính thường hay yêu cầu, thiết kế lại từ bên trở Tuy nhiên, sách thử với Perl 4.0 Mọi thứ làm việc với 5.0 sau Perl Trong thực tế, chương trình Perl 1.0 làm việc tốt với gần đây, ngoại trừ vài thay đổi khác cần cho nâng cấp 1.2 Mục đích Perl Perl thiết kế để trợ giúp cho người dùng UNIX với nhiệm vụ thơng dụng mà nhậy cảm với tính khả chuyển trình shell, ngắn khơng phức tạp ngơn ngữ lập trinh C hay ngôn ngữ công cụ UNIX khác Khi quen thuộc với Perl, bạn thời gian để lấy trích dẫn dòng lệnh shell (hay khai báo C), thời gian để lập trình Perl công cụ trợ giúp tuyệt vời Các cấu trúc chặt chẽ Perl cho phép tạo số giải pháp với cơng cụ mang tính tổng qt Cũng vậy, bạn lấy cơng cụ sang cơng việc tiếp, Perl có tính khả chuyển cao lại có sẵn hầu hết hệ thống Giống ngơn ngữ khác, Perl “chỉ viết” - tức viết chương trình cho máy hiểu mà người "đọc hiểu" Nhưng ý cẩn thận, bạn tránh điều Thật vậy, Perl trông khó với khơng quen, với người lập trình thạo Perl, dễ (???) Nếu bạn làm theo hướng dẫn sách chương trình bạn dễ đọc, dễ bảo trì nâng cấp 1.3 Tính sẵn có Nếu bạn nhận lỗi nhỏ: Perl: not found bạn thử gọi Perl từ dịng lệnh shell điều có nghĩa Perl chưa cài đặt hệ thống bạn Nhưng bạn hồn tồn lấy Perl miễn phí vài cài vào hệ thốgn Perl phân phối theo Giấy phép Cơng cộng GNU (GNU Public License), nghĩa bạn phân phát binary Perl với điều kiện phải kèm theo mã ngồn miễn phí; bạn sửa đổi Perl thep ý bạn bạn phải phân phối mã nguồn phần mà bạn sửa đổi Bạn lấy mã nguồn Perl hồn tồn miễn phí qua đường download mà tốn vài MB để lưu trữ khoảng thời gian để tải xuống Trong thực tế, khơng miễn phí mà chạy cịn gọn gần thứ mà gọi UNIX hay tựa UNIX có trình biên dịch C Đó Perl có phần gọi "Cấu hình" có nhiệm vụ gọi vào danh mục hệ thống để tìm thứ cần, điều chỉnh việc đưa vào tệp kí hiệu xác định tương ứng, cuối chuyển cho bạn việc kiểm chứng phát Bên cạnh hệ thống UNIX hay tựa UNIX, "tín đồ" Perl đem sang Amiga, Atari ST, họ Macintosh, VMS, OS/2, chí MS/DOS, Windows - có lẽ nhiều bạn đọc dịng chữ Vị trí xác có sẵn Perl biến động, phải hỏi nhóm tin Usenet chẳng hạn để có thơng tin Nếu bạn newbie, cũ Perl có đĩa phần mềm CD-ROM UNIX Power Tools, Jerry Peek, Tim O’Reilly Mike Loukides (O’Reilly & Associates/ Random House Co., 1993), bạn tìm download www.perl.org 1.4 Hỗ trợ (nếu có khúc mắc) Bạn liên hệ trực tiếp với Larry nhóm hỗ trợ Perl trực tuyến toàn giới, liên lạc thơng qua nhóm tin Usenet comp.lang.perl gửi u cầu tới perl-users-request@virgina.edu Bên cạnh nhóm tin, bạn nên đọc tạp chí Perl, việc phân phối Perl Một nguồn có thẩm quyền khác sách Programming Perl Larry Wall Randal L Schwatrz (O’Reilly & Associaté, 1990) 1.5 Các khái niệm Perl Một kịch shell dãy lệnh shell đưa vào tệp văn Tệp chạy cách bật bit thực (qua chmod +x filename) gõ tên tệp dấu nhắc shell Chẳng hạn, kịch shell để chạy lệnh date sau lệnh who viết sau: $ echo date > somecript $ echo who >> somecript $ cat somescript date who $ chmod +x somescript $ somescript [output of date followed by who] $ Tương tự, chương trình Perl bó câu lệnh định nghĩa Perl đưa vào tệp Rồi bạn bật bit thực gõ tên tệp lời nhắc vỏ Tuy nhiên, tệp phải chương trình Perl khơng phải chương trình shell, nên cần bước phụ: đặt #!/usr/bin/perl làm dòng tệp Nhưng Perl bạn cài vào nơi không chuẩn (không phải /usr/bin), hay hệ thống tựa UNIX bạn không hiểu dịng #!, bạn hỏi người quản trị hệ thống bạn để giúp đỡ Các thí dụ sách giả sử hệ thống bạn cài đặt Perl vào /usr/bin Perl ngôn ngữ phi định dạng kiểu C - khoảng trắng phần tử chương trình tuỳ chọn, hai phần tử chương trình dính liền với bị lầm lẫn thành khác, trường hợp khoảng trắng thuộc loại bắt buộc (Khoảng trắng bao gồm dấu cách, dấu tab, xuống dòng, đầu dòng hay sang trang mới) Có vài cấu trúc địi hỏi loại khoảng trắng chỗ đó, đừng lo, tài liệu rõ cho bạn biết khoảng trắng phải đặt với số lượng Có thể giả thiết loại số lượng khoảng trắng phần tử chương trình tuỳ ý trường hợp khác Mặc dù gần tất chương trình Perl viết tất dịng, chương trình Perl điển hình viết xuống dịng canh lề chương trình C, với phần câu lệnh lồng viết vào sâu chút chẳng hạn, làm cho chương trình bạn dễ nhìn dễ hiểu Cũng giống kịch shell, chương trình Perl bao gồm tất câu lệnh perl tệp lấy tổ hợp chung trình lớn cần thực Khơng có khái niệm hàm main C Chú thích Perl giống thích kịch shell: nằm dấu # tới cuối dịng thích Perl khơng có thích nhiều dịng C Không giống hầu hết shell (nhưng giống awk sed), thơng dịch Perl phân tích biên dịch hồn tồn chương trình trước thực Điều có nghĩa bạn khơng nhận lỗi cú pháp từ chương trình chương trình bắt đầu chạy, có nghĩa khoảng trắng thích lược bỏ khơng làm chậm chương trình Trong thực tế, giai đoạn biên dịch bảo đảm việc thực nhanh chóng thao tác Perl bắt đầu, cung cấp động phụ để loại bỏ C ngơn ngữ tiện ích hệ thống đơn dựa tảng C coi trình biên dịch Việc biên dịch tiêu tốn thời gian Và phi hiệu chương trình Perl lớn lại thực nhiệm vụ nhỏ bé (trong số nhiều nhiệm vụ tiềm năng) thốt, thời gian chạy cho chương trình "nhỏ xíu" so với thời gian biên dịch Cho nên Perl giống biên dịch thơng dịch Nó biên dịch chương trình đọc phân tích hồn tồn trước câu lệnh thực Nó thơng dịch khơng có mã đích chiếm khơng gian đĩa Hiểu theo cách đó, tốt cho hai loại 1.6 Sơ lược Perl Sau giới thiệu số tính khác cách bổ sung vào ứng dụng nhỏ Giải thích ngắn gọn - vùng chủ đề thảo luận chi tiết nhiều sau sách Nhưng việc "xem qua" cho bạn kinh nghiệm nhanh chóng ngơn ngữ • 1.6.1 Chương trình “Hello” Ta nhìn vào chương trình nhỏ sau: #!/usr/bin/perl print "Hello!\n"; Dịng báo chương trình Perl Nó lời thích cho Perl cuối dòng, giống hầu hết kịch shell hay awk Dịng thứ hai tồn phần thực chương trình Tại thấy câu lệnh print Hàm print bắt đầu chương trình, có đối số xâu văn kiểu C Bên xâu này, tổ hợp kí tự \n biểu thị cho kí tự dịng Giống C, tất câu lệnh đơn giản kết thúc dấu chấm phảy (;) Khi bạn gọi chương trình này, phần kernel gọi thơng dịch Perl, phân tích tồn chương trình (hai dịng, kể dịng thích đầu tiên) thực dạng dịch Thao tác thực hàm print Sau chương trình hồn tất, tiến trình Perl trả mã cho shell để báo chương trình kết thúc • 1.6.2 Hỏi câu hỏi nhớ kết Ta viết lại chương trình chút, thay Hello trống khơng, chương trình chào tên người nhập vào từ bàn phím Để làm việc này, ta cần chỗ lưu giữ tên, cách hỏi tên, cách nhận câu trả lời Để đặt chỗ giữ giá trị (VD: tên) ta dùng biến vô hướng Với chương trình này, ta dùng biến vơ hướng $name để giữ tên (xem chi tiết chương sau: Dữ liệu vơ hướng, mà biến giữ, làm với chúng) Bây giờ, giả sử bạn giữ số hay xâu (dãy kí tự) biến vơ hướng Chương trình cần hỏi tên Để làm điều đó, ta cần cách nhắc cách nhận vào Chương trình trước cho ta cách nhắc - dùng hàm print Và để nhận dòng từ thiết bị cuối ta dùng toán tử Ta liệu nhập vào cho biến $name: print "Ten ban la gi? "; $name = ; Giá trị $name điểm có ký tự xuống dịng cuối (vì bạn phải nhấn Enter để kết thúc việc nhập tên) Để bỏ qua kí tự đó, dùng hàm chop() Hàm lấy biến vô hướng làm đối số bỏ ký tự cuối từ giá trị xâu biến: chop($name); Sau in câu chào: print "Xin chao ban $name"; Và ta có chương trình hồn chỉ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 ta muốn có lời chào đặc biệt cho Jenny, muốn lời chào thông thường cho người khác Để làm điều này, ta cần so sánh tên đưa vào với xâu Jenny, hai xâu trùng khớp, làm điều đặc biệt Ta bổ sung thêm lệnh if-then-else phép so sánh vào chươ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 so sánh hai xâu Nếu (từng kí tự một, có chiều dài) kết True, ngược lại False Câu lệnh if chọn xem "khối" câu lệnh so sánh thực - biểu thức ($name eq "Jenny") True, khối chưa câu lệnh print "Chao Jenny! Lam bai tap di chu!\n"; thực hiện, trường hợp ngược lại khối chưa câu lệnh print "Xin chao ban $name!\n"; • 1.6.4 Đốn từ bí mật Để người chạy chương trình đốn từ bí mật Với người trừ Jenny, ta cho chương trình hỏi lặp lại để đoán đến người đốn Hãy xem chươ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); } } Trước hết, ta định nghĩa tên cần đốn việc đặt vào biến vơ hướng khác, $secretword Sau đón chào, người (không phải Jenny) yêu cầu (với câu lệnh print khác) đoán chữ Lời đoán đem so sánh với từ cần đoán việc dùng toán tử ne, mà cho True xâu khơng (ne tốn tử ngược với toán tử eq) Kết việc so sánh kiểm sốt while, chu trình thực việc so sánh cịn True • 1.6.5 Nhiều từ bí mật Ta xem cách thức sửa đổi đoạn chương trình phép có nhiều từ bí mật Bằng việc dùng điều ta thấy, so sánh lời đốn lặp lặp lại theo chuỗi câu trả lời rõ cất giữ biến vô hướng tách biệt Tuy nhiên, danh sách khó mà thay đổi hay đọc vào từ tệp hay thiết bị khác Một giải pháp tốt cất giữ tất câu trả lời vào cấu trúc liệu gọi danh sách hay mảng Mỗi phần tử mảng biến vơ hướng tách biệt mà đặt giá trị hay truy cập độc lập Toàn mảng trao cho giá trị để ta "truy nhập" vào Ta gán giá trị cho tồn mảng có tên @words cho chứa ba mật hiệu: @words =("littlecat", "smalldog", "bigmouse"); Tên biến mảng bắt đầu với @, chúng khác biệt với tên biến vô hướng Một mảng gán ta truy cập đến phần tử cách dùng tham khảo số Cho nên $words[0] littlecat, $words[1] smalldog, $words[2] bigmouse Chỉ số biểu thức, ta đặt $i $words[$i] bigmouse (Tham khảo số bắt đầu với $ thay @ chúng tham khảo tới phần tử riêng mảng thay tồn mảng) Quay trở lại với thí dụ trước 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 tu $correct = "co the"; #tu co doan dung hay khong? while ($correct eq "co the") { #cu kiem tra den het 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 lan nua } } #key thuc cua while ($correct eq "co the") } #Ket thuc cua "not Jenny" Chú ý dùng biến vô hướng $correct để tìm mật hiệu đúng, khơng tìm thấy Chương trình giới thiệu khối elsif câu lệnh if-then-else Khơng có lệnh tương đương C hay awk - việc viết tắt else theo sau if không lồng cặp dấu () khác Đây giống Perl để so sánh tập điều kiện việc phân tầng if-elsif-elsif-elsif-else • 1.6.6 Cho người từ bí mật khác Trong chương trình trước, người tới đốn từ ba từ thành cơng Nếu ta muốn từ bí mật khác cho người, ta cần bảng so sánh người từ: Người Chip Dale Tom Jerry Từ bí mật littlecat smalldog bigmouse bigmouse Chú ý Jerry Tom có chung từ bí mật bigmouse; điều hoàn toàn hợp lệ Cách dễ để cất giữ bảng Perl "mảng băm" (hash array) Mỗi phần tử mảng giữ giá trị vô hướng tách biệt (giống kiểu mảng khác), mảng lại tham khảo theo khố, giá trị vơ hướng (bất kì xâu hay số, kể số không nguyên giá trị âm) Để tạo mảng băm %words (chú ý % @) với khoá giá trị cho bảng trên, ta gán giá trị cho %words (như ta làm nhiều trước với mảng khác): %words = ( "Chip" , "Dale" , "Tom" , "Jerry", ); "littlecat", "smalldog", "bigmouse", "bigmouse" Mỗi cặp giá trị danh sách biểu thị cho khoá giá trị tương ứng mảng băm Chú ý ta chia phép gán dịng mà khơng có loại kí tự nối dịng nào, khoảng trắng phần tử chương trình nói chung vơ nghĩa Perl Để tìm từ bí mật cho Tom, ta cần dùng Tom khoá tham khảo vào mảng kết hợp %words, qua biểu thức $words{"Tom"} Giá trị tham khảo bigmouse, tương tự điều ta làm trước với mảng khác Cũng trước đây, khoá biểu thức nào, gán $person Tom $words{$person} trả giá trị bigmouse Chương trình hồn chỉ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 } else { print "Xin chao ban $name!\n"; $secretword = $words{$name}; print "Tu bi mat la gi? "; $guess = ; chop($guess); while ($correct ne $secretword) { print "Sai roi thu lai di Tu $guess = ; chop($guess); } #ket thuc cua while } chu!\n"; #chao thuong thuong #lay tu bi mat bi mat la gi? "; Bạn ý nhìn vào từ bí mật Nếu khơng tìm thấy từ giá trị $secretword xâu rỗng, mà ta kiểm tra liệu ta có muốn xác định từ bí mật mặc định cho khác khơng Đây cách xem nó: # $secretword = $words{$name}; #lay tu bi mat if ($secretword eq "") { #khong thay $secretword = "none"; } print "Tu bi mat la gi?"; # • 1.6.7 Giải định dạng đầu vào thay đổi Nếu đưa vào Jenny L Schwartz hay jenny thay Jenny chương trình khơng đưa kết mong đợi Vì tốn tử so sánh eq lại so sánh ký tự Ta xem cách giải cho điều Giả sử tơi muốn tìm xâu bắt đầu với Jenny, thay xâu Jenny Tơi làm điều sed hay awk grep với biểu thức qui-một tiêu xác định tập hợp xâu sánh Giống sed hay grep, biểu thức qui Perl để sánh xâu bắt đầu với Jenny ^Jenny Để sánh xâu với xâu $name, dùng toán tử so sánh sau: if ($name =~ /^Jenny/) { ## yes - True } else { ## no - False } Chú ý biểu thức qui định biên dấu sổ chéo (/) Bên dấu sổ chéo dấu cách khoảng trắng có nghĩa, hệt chúng bên xâu Nhưng chưa giải việc lựa chọn jenny hay loại bỏ Jennyy Để chấp nhận jenny, thêm tuỳ chọn bỏ qua không xét chữ hoa chữ thường, chữ i nhỏ thêm vào sau dấu sổ chéo thứ hai Để loại bỏ Jennyy, ta thêm đánh dấu đặc biệt định biên từ (tương tự với vi số grep) dạng \b biểu thức qui Điều đảm bảo kí tự sau chữ y biểu thức qui khơng phải kí tự a,b,c khác Điều làm thay đổi biểu thức qui thành /^jenny\b/i, có nghĩa "jenny đầu xâu, khơng có kí tự hay chữ số theo sau, chấp nhận hai kiểu chữ hoa thường" Ta có chương trình sau: #!/usr/bin/perl %words = ( "Chip" , "littlecat", "Dale" , "smalldog", "Tom" , "bigmouse", "Jerry", "bigmouse" ); print "Ten ban la gi? "; $name = ; chop($name); if ($name =~ /^jenny\b/i) { print "Chao Jenny! Lam bai tap di } else { print "Xin chao ban $name!\n"; $secretword = $words{$name}; if ($secretword eq "") { $secretword = "none"; } print "Tu bi mat la gi? "; $guess = ; chop($guess); while ($correct ne $secretword) { print "Sai roi thu lai di TU $guess = ; chop($guess); } #ket thuc cua while } chu!\n"; #chao thuong thuong #lay tu bi mat #khong thay bi mat la gi? "; ...Diễn đàn tin học | Tutorial Room Mục lục »» Chương Learning Perl - Chương 1: Giới thiệu qua Perl Lịch sử Perl Mục đích Perl Tính sẵn có Hỗ trợ (nếu có khúc mắc) Các khái niệm Sơ qua Perl Bài tập... sách thử với Perl 4.0 Mọi thứ làm việc với 5.0 sau Perl Trong thực tế, chương trình Perl 1.0 làm việc tốt với gần đây, ngoại trừ vài thay đổi khác cần cho nâng cấp 1.2 Mục đích Perl Perl thiết... ngữ khác, Perl “chỉ viết” - tức viết chương trình cho máy hiểu mà người "đọc hiểu" Nhưng ý cẩn thận, bạn tránh điều Thật vậy, đơi Perl trơng khó với khơng quen, với người lập trình thạo Perl, dễ

Ngày đăng: 22/10/2022, 07:50

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...