Ngôn ngữ lập trình PERL
Trang 1Theo ngôn ngữ của tác giả, Larry Wall, thì Perl là ngôn ngữ cho việc “Getting
your job done” Perl được dùng cho việc : Quản trị Hệ thống, CGI Script, biến đổi dữ liệu, phân tích nguồn gốc một cách tuần tự, và dịch chuyển
Perl viết tắt của Practical-Extraction and Report- Language là một ngôn ngữ lập trình do Larry Wall sáng tác với mục đích chung quy là tạo ra những bản báo cáo một cách nhanh chóng và dễ dàng Do có nhiều toán tử cũng như hàm để hỗ trợ riêng cho xử lý text nên Perl khác biệt với các ngôn ngữ khác là có tính chất xử lý text rất mạnh, có thể xử lý dễ dàng những tác vụ giống như C hoặc UNIX shell thường làm trong việc viết một Script nhưng có thể ngắn gọn và đơn giản hơn Không giống như các trình biên dịch C hay C++, Perl là một trình thông dịch
2 Perl có thể chạy trên các môi trường khác nhau như :
- UNIX PERL chạy trên môi trường Unix
- PERL FOR WINDOWS NT chạy trên môi trường Windows NT
-WIN PERL chạy trên môi trường Windows 95/ Windows 98)
II Ngôn ngữ PERL
A Nguyên tắc xử lý văn bản
(Principles of General Text Processsing The Backbone of PERL)
Trong phần này, chúng ta sẽ bắt đầu tìm hiểu về Perl cụ thể là chúng ta sẽ
phải chú ý đến "text", những khối căn bản cho việc thông tin liên lạc trong CGI,
như thế nào, và Perl giao tiếp với text tốt như thế nào.
Text là dữ liệu dạng kí tự, số nguyên, kể cả những kí tự đặc biệt mà chúng
ta sử dụng trong việc tạo ra những text file, HTML file, script của Perl
1 Scalar data:
Toán hạng vô hướng được gán 1 số hoặc 1 chuổi ký tự văn bản Perl khôngphân biệt giữa số với chuổi ký tự và xử lý chúng như nhau Bất kì sự chọn lọcnào của những số hoặc những ký tự được gọi là dữ liệu vô hướng (scalar data).Biến scala được dùng hoặc được thao tác với những tác vụ Những thao tácnày có thể sinh ra giá trị scala khác, giá trị scala được lưu trong biến scala.Ta cóthể đọc giá trị scala từ file hoặc ghi vào
Trang 2Trong khi số và chuổi được xử lý như nhau trong perl thì có một số chi tiếtnhỏ ta cần nhận biết, để có thể giúp ta (người lập trình) cách ly được với nhữngkẻ hacker.
* Số thực _ số nguyên và literals :
Perl xử ly ùsố thực và số nguyên như những literal (Literal : cách thức chỉ ramột giá trị được định rõ trong việc mã hoá thực sự của chương trình) Đây là dữliệu đượïc cung cấp cho trình biên dịch Perl Perl chấp nhận những kiểu số sau :
- số nguyên - phân số - số âm - số mũ
* Số nguyên :
Không được bắt đầu bằng số 0 vì Perl có thể hiểu lầm sang số hệ 16 hoặc hệ
8 là những số có thể bắt đầu bằng số 0
Khả năng này để xử lí chuổi, không quan tâm đến những kí tự, khi thực hiệnnó sẽ làm cho Perl thích nghi với lập trình CGI, Perl cũng xử lí những kí tự nhưnhững kí hiệu literal
Có 2 loại chuổi literal: nháy đơn và nháy kép :
- Chuổi nháy đơn : Là chuổi chứa trong cặp nháy đơn, dấu nháy đơn báo
cho Perl biết diểm bắt đầu và kết thúc của chuổi Nếu muốn đưa dấu nháy đơnvào bên trong một chuổi (không xữ lý nó _như giới hạn một chuổi), thì ta đặtchuổi đó ở phía sau dấu \ Khi đã đặt một dấu \ vào trong chuổi thì cũng phảiđặt nó ở cuối chuổi
- Chuổi nháy kép : Khi một chuổi được bao quanh bởi một nháy kép thì đó
là một chuổi nháy kép Bên trong một chuổi nháy kép, dấu \ được sử dụng đểchỉ ra một vài kí tự điều khiển hoặc số hệ 8 và thậm chí hệ 16 để đại diện chonhững kí tự đặc biệt
Một khía cạnh khác của chuổi nháy kép đó là chúng là những biến có khảnăng tự thêm vào, có nghĩa là mỗi lần chuỗi được đọc thì biến bên trong chuổisẽ có giá trị hiện tại đã được thay thế
Những dòng chú thích trong perl được bắt đầu với kí hiệu #
Trang 32 Những tác vụ
Tác vụ Chop :
Tác vụ chop được dùng để loại bỏ kí tự cuối cùng của đối số ở bên trong cặp dấu ngoặc đơn Khi so sánh những biến với nhau, Perl sẽ tìm xem chúng đúng hay sai (true hay false), ghi lại kết quả rồi tiếp tục Perl xử lý một dòng trống như một null string sẽ cho giá trị false Trong khi nếu 1 dòng trống là một hàng mới, được cho bởi giá trị "\n" thì mang giá trị true
Tuy nhiên, chúng ta không muốn có dòng trống đó, nên ta có thể dùng tác vụ chop để bỏ nó Giá trị default của chop() là bỏ đi kí tự cuối cùng
Chúng ta sẽ còn gặp lại tác vụ này rất nhiều trong các script,đặc biệt làđược
được dùng với giá trị “\n”
Tác vụ print
Một khi chúng ta lấy được dữ liệu vào script, chúng ta muốn di chuyển giátrị trong script đó và xuất kết quả ra vị trí mong muốn, như truyền cho script khác, một file, máy in, địa chỉ e-mail, hay màn hình
Chúng ta đụng đến <STDOUT>.Tác vụ print làm việc chung với
<STDOUT> để xuất dữ liệu của script.Tác vụ print lấy một giá trị vô hướng (vàcả danh sách các giá trị của một mảng ) và đặt vào <STDOUT> Dữ liệu từ
<STDOUT> sẽ được chuyển đến nơi mong muốn : script khác, file, máy in,…
Tác vụ số :
Chia lấy phần dư được gọi là Modulus (kí hiệu là %) , khi nó chia 2 sốchỉ chia giá trị nguyên, không chia giá trị thực, sau đó nó lấy phần dư làm giá trịmới
Ví dụ : 25.3 % 4.437 thì trước hết nó được chuyển thành 25 % 4 rồi sau đó lấy 25:4=6 dư 1 (số dư 1 chính là kết quả)
* Bảng liệt kê tất cả tác vụ số :
Trang 4Tác vụ chuỗi :
Những tác vụ chuỗi cũng làm việc giống như những tác vụ số nhưng được
thay thế bằng các kí tự Tác vụ ghép nối có thể cho kết quả khác một chút :
ví dụ : "Hey," "now!" "Hey,now!"
"Hey,now!" "\n" "Hey,now!\n"
"Hey," "" "now!" "Hey, now!"
* Những tác vụ chuỗi khác được liệt kê trong bảng sau :
Đối với chuổi thì Perl lấy giá trị Ascii của kí tự số nên 30 sẽ nhỏ hơn 7 bởi
vì 3 nhỏ hơn 7 trong bảng Ascii
Perl xử lí những gì ở trong dấu ngoặc đơn trước, nó cũng có những độ ưu tiên và những sự kết hợp đặc biệt
3 Biến vô hướng(Scalar Variables)
Khi 1 chương trình chạy thì giá trị vô huớng có thể thay đổi nhưng biến vôhuớng thì không thay đổi Biến vô hướng chỉ có thể chứa 1 giá trị vào 1 thờiđiểm, nhưng giá trị đó có thể thay đổi khi chương trình yêu cầu Một biến vôhướng có dạng :
$ tên_biến $biến_khác(giữa 2 biến có một khoảng trắng)
Trang 5Khoảng trắng kết thúc một tên biến Tên biến có phân biệt chữ hoa chữthường Ví dụ:
$JAZZ khác với $jazz khác với $Jazz
Những biến làm việc với những tác vụ để cho chúng những giá trị
Ví dụ : $IQ = 130
$Weight = $IQ + 20
$page = $Weight - 17
Ta cũng có thể sử dụng biến vô hướng ở cả hai vế của một tác vụ
Ví dụ : $income = $income - $food
Perl đã phát triển thêm một dạng ngắn gọn để làm việc này, gọi là một
binary assignment operator (tác vụ gán nhị phân).
Chúng ta chỉ có thể sử dụng tác vụ tự động tăng và tự động giảm để thay đổi biến một bước mà thôi
* Sự tự đưa thêm vào của những biến scalar vào bên trong chuỗi
a Sự tự đưa thêm vào chỉ liên hệ với chuỗi dấu nháy kép
Ví dụ :
1 $uid = "Sam";
$new = "new $uid";
thì $new sẽ có giá trị là "new Sam"
2 $x="$new and $data";
thì $x sẽ chỉ có giá trị là : "new Sam and" bởi vì biến $data chưa được định nghĩa
Sự tự đưa thêm vào, có nghĩa là "đặt một giá trị literal vào một chuỗi", nó chỉthực hiện ở lần duyệt đầu tiên trong một hàng
Ví dụ :
$min="$time";
$clock="$min left to go";
thì giá trị của $clock sẽ là: "$time left to go" Không có sự thay đổi kép ở đây
Trang 6* Nếu ta muốn tránh sự tự thay thế này thì ta thêm dấu nháy đơn vào vùng đó của chuỗi hoặc đặt một dấu suyệt ngược (backslash) phía trước kí hiệu $ Ví dụ :
$x="Biến dùng cho id của người sử dụng là".'$user';
$y=" Biến dùng cho id của người sử dụng là \$user";
Kết quả của cả hai biến trên đều là : " Biến dùng cho id của người sử dụng là
$previous="You are $old user.";
$current="You are { $new} user.";
Biến $previous khi được in ra sẽ là : "You are $old user." Vì Perl hiểu $olduser như là một biến mới Nhưng nếu ta thêm dấu { } (curly braces) vào thì ta sẽ có đưọc kết quả vừa ý hơn, đó là: biến $current sẽ là : "You are name_two user."Chúng ta tránh được sự lộn xộn bằng cách đặt biến trong cặp dấu { }
Curly braces, thực hiện một số nhiệm vụ trong Perl, từ việc phân ranh câu ghép đến việc đánh dấu nơi bắt đầu _ kết thúc của vòng lặp và chương trình con Thậm chí chúng còn bao gồm cả những biểu thức có qui tắc (sẽ trình bày ở chương sau)
Chúng ta cũng có thể đổi từ chữ thường sang chữ hoa và ngược lại đối với các biến và các giá trị bằng cách sử dụng các tác vụ đi kèm với dấu suyệt ngược
“ \ ” Ví dụ :
$user="\LNAME"; sẽ đổi giá trị 'NAME' thành 'name'
$new="NAME";$user="\L$new"; giá trị của $user sẽ là: 'name'
$biguser="\u\LNAME"; $biguser sẽ là 'Name'
$biguser="\u\L$user"; $biguser sẽ là 'Name'
Với sự tự thêm vào của biến thì chỉ có những chuỗi dấu nháy kép mới sử dụng được những chức năng này
Standard Input <STDIN>
Trong Perl có một biến đặc biệt được gọi là Standard Input hay
<STDIN>.Thật ra <STDIN> không chỉ đơn thuần như một biến vô hướng nó còn
là một filehandle Những filehandle thông dụng khác của Perl là
<STDOUT>(standar output), <STDERR> (standar error) Một filehandle giúp cho Perl tạo một input và output, hoặc I/O, nối giữa một script đang chạy hay một quá trình với một người sử dụng (Người sử dụng có thể là con người hay là một quá trình khác)
Trang 7Khi <STDIN> được sử dụng ở vị trí của một biến vô hướng thì nguyên hàng văn bản kế tiếp được đọc vào sẽ là giá trị của biến <STDIN> Nguyên hàng có nghĩa là tất cả những từ ngữ xuất hiện cho tới khi có một hàng mới hoặc một chuỗi rỗng Giá trị chuỗi của <STDIN> luôn có một hàng mới xuất hiện ở cuối cùng vì người sử dụng đã nhấn phím kết thúc hoặc click vào nút done sau khi
nhập xong văn bản Ta có thể dùng tác vụ CHOP để loại bỏ hàng mới này Cụ
thể là :
$name=<STDIN>; #user được yêu cầu nhập vào tên họ
chop $name; #loại bỏ hàng mới
Chúng ta cũng có thể trộn hai hàng này thành một :
Chop ($name=<STDIN>)
Chúng ta có thể dùng <STDIN> để kết hợp với form của HTML Dữ liệu khi được gởi qua phương pháp POST từ một form, nó sẽ đi vào <STDIN>.Toàn bộ thảo luận về form của HTML, mối quan hệ với CGI được trình bày trong phần trước : "Tìm hiểu CGI "
* Chú ý về filehandle :
Khi một file được mở ra để đọc thì tên của file được gán cho biến
filehandle Khi cần đọc hay ghi vào file thì script của Perl tham khảo đến
filehandle chứ không phải bản thân của file đó Perl nhận biết bàn phím, chuột, hay dữ liệu từ CGI như là một file khác, và nó đặt những dữ liệu này vào
<STDIN> Trình thông dịch của Perl cũng xử lý màn hình như là một file, và cho nó vào filehandle <STDOUT>
* Giá trị không xác định
Nếu không có giá trị nào được gán cho một biến vô hướng thì sẽ không làm ảng hưởng gì đến Script của chúng ta bởi vì Perl có cung cấp một loại giá trị không xác định, nó được đại diện bởi số 0 đối với số nguyên và là một chuỗi rỗng có chiều dài bằng 0I với chuỗi
Cách dùng đặc biệt của giá trị không xác định là khi <STDIN> đọc file, khi đọc tới một hàng trống(hay một null string) thì giá trị không xác định sẽ trả về cho <STDIN>
3 Mảng (Array defined)
Mảng là một danh sách có thứ tự của các dữ liệu vô hướng Những thành phần của mảng đều được sắp thứ tự từ thấp nhất đến cao nhất Mảng không có giới hạn về kích cỡ (size) Những biến khác nhau của mảng được đặt trong cặp dấu ngoặt đơn và cách nhau bằng dấu phẩy
Ví dụ mảng :
(1,2,3);
($A,$B,$C);
Trang 8(1 10); => tương đương với (1,2,3,4,5,6,7,8,9,10)
(1.2 4.2); => tương đương với (1.2,2.2,3.2,4.2)
(1 4,8,10); => tương đương với (1,2,3,4,8,10)
($A $B); => tương đương với vùng giá trị giữa 2 biến $A và $B
Chú ý :
(1.3 4.2); sẽ tạo ra (1.3,2.3,3.3) rồi ngưng vì 4.3>4.2
Chúng ta cũng có thể dùng tác vụ print với mảng
Ví dụ : $total=@user_list ; biến $total sẽ lấy chiều dài của mảng @user_list
print("Bạn là người khách thứ ",$total,"\n");
Mỗi khi có một user mới truy cập vào trang web đó thì một dữ liệu mới sẽ được cộng thêm vào mảng @user_list.Và biến $total sẽ chứa tổng số giá trị của mảng hay còn gọi là chiều dài của mảng
a Biến mảng (Array Variables)
Biến vô hướng được kí hiệu bởi dấu $ thì biến mảng dùng kí hiệu @.Tên của biến không có giới hạn về số kí tự Có thể tồn tại một biến mảng và một biến vô hướng có cùng tên mà không ảnh hưởng gì cả vì Perl giữ những giá trị này riêng biệt nhau
Một mảng rỗng cho một giá trị null hoặc một danh sách rỗng và vì vậy một biểu thức có thể sửa chữa toàn bộ biến mảng hoặc một phần của một biến mảng.Điều này khác với biến vô hướng,chỉ mang một giá trị nên hoặc là nó sửa hoàn toàn hoặc là nó để nguyên vậy
b Tác vụ mảng (Array operators)
Tác vụ mảng cũng giống như tác vụ vô hướng.Một giá trị trả về có thể sẽ là giá trị cho một tác vụ khác hoặc là gán nó cho một biến mảng khác.Chỉ có một điều khác biệt là : tác vụ mảng liên quan tới việc sửa đổi một danh sách cácgiá trị trong khi tác vụ vô hướng chỉ sửa đổi 1 giá trị
Những tác vụ mảng quan trọng nhất là : tác vụ gán,chỉ số hóa,đẩy vào và lấy ra(push & pop),shift & unshift,đảo ngược,sắp xếp và tác vụ chop Những điểm đặc biệt khác của mảng được sử dụng với những phần tử (elements ) truy cập và
<STDIN>.Một phần tử (element) trong mảng là tên được gán cho mỗi giá trị
Trang 9trong danh sách.Những phần tử cũng được sử dụng khi làm việc với những mảngliên kết.
Tác vụ gán :
Tác vụ này gán một giá trị cho một biến mảng Cũng giống như những
biến vô hướng, tác vụ gán của mảng cũng sử dụng kí hiệu "=" để gán những giátrị của biến Perl phân biệt tác vụ gán vô hướng với tác vụ gán của mảng dựa vào biến đang được gán; nó ghi nhớ một tác vụ gán vô hướng với một biến vô hướng và tác vụ gán của mảng với biến mảng Khi một giá trị vô hướng được gán vào một biến mảng thì nó sẽ trở thành một phần tử (element) của biến mảng.Mảng có thể lưu giữ một hoặc nhiều phần tử
Danh sách mảng cũng có thể chứa đựng những biến mảng Chúng được chuyển đổi thành giá trị literal của mảng chứa chúng khi danh sách được xác định, giống như ví dụ sau :
($F,$Y,$I = (1,2,3); => $F là 1,$Y là 2,$I là 3
($P,$C) = ($C,$P); => tức là $P và $C có giá trị bằng nhau ($P,@C) = ($F,$Y,$I); => $P = $F và danh sách @C sẽ là ($Y,$I) ($A,@C) = @C; => giá trị đầu tiên của danh sách @C được chuyển thành $A, tức là $A=$Y và @C=($I)
Nơi mà bất kỳ những biến bổ sung ở vế trái của tác vụ gán được cho giá trịkhông xác định (undef), và một giá trị bổ sung ở vế phải sẽ biến mất
Nếu ta sử dụng một biến mảng trong một danh sách mảng literal thì nó phải là biến cuối cùng Bất kỳ một biến mảng nào khác được sử dụng trong literal sẽ được gán giá trị không xác định Điều này thật quan trọng nếu như script của chúng ta không có giá trị cho mỗi phần tử (element) trong một mảng, bởi giá trị không xác định trong Perl cũng được xử lý như giá trị False Giá trị không xác định cũng có thể được dùng để tìm ra nơi cuối cùng của những phần tử với những giá trị được gán trong một mảng
Khi gán một biến mảng cho một biến vô hướng, giá trị xác định bởi biến
Trang 10vô hướng sẽ là số thành phần của danh sách mảng hoặc là chiều dài của danh sách như :
@IMHO = (5,4,6,7,2);
$IMHO = @IMHO; => biến $IMHO bây giờ có giá trị là 5, là
chiều dài của danh sách của biến @IMHO
Một tên biến của mảng cũng có thể được đặt vào vị trí của một giá trị vô hướng như :
$IMHO = @PGP; => biến $IMHO sẽ lấy chiều dài của @PGP hoặc :
($SSE) = @VTR; => biến $SSE sẽ lấy element đầu tiên của @VTR làm giá trị của nó
Ta có thể xếp những tác vụ gán mảng lồng vào bên trong những tác vụ gán mảng khác để thu được kết quả như ví dụ sau :
@BBQ = (@ORA = (4,8,6) ); => cả hai biến @BBQ và @ORA cùng có danh sách (4,8,6)
hay : @BBQ = @ORA =(4,8,6); => cũng cho kết quả tương tự
Ngữ cảnh dãy và vô hướng(Array and Scalar Context)
Như đã đề cập trước đây, phụ thuộc vào phía xuất hiện của dãy and/or vô hướng trong tác vụ gán Nếu Perl được báo trước toán hạng là vô hướng thì tác vụ sẽ tính toán với ngữ cảnh vô hướng Ngược lại nếu Perl nhận được toán hạng là dãy thì nó sẽ tính toán với ngữ cảnh dãy
Ngữ cảnh có thể ảnh hưởng những thủ tục của ta bằng cách thay đổi những giátrị của dãy hay vô hướng do đó phải cẩn thận với nó Một biểu thức có thể truy xuất một toán hạng trong ngữ cảnh vô hướng bằng cách ghép một chuổi rổng (null) như sau:
Tác vụ đánh số :
Mỗi phần tử trong một dãy được gán một nhãn hay giá trị nền (index) bắt đầu bên trái với số không và tăng lên đến một số nguyên đến cuối danh sách Những chỉ
Trang 11số được dùng bởi tác vụ truy xuất phần tử hoặc là tác vụ đánh số để chuyển một giá trị vào biến khác Nó có ích đối với những phần tử từ một dãy cho mục đích chuyển chúng vào trong một kiểu vô hướng hoặc là sửa những phần tử tồn tại trong một dãy Những khả năng này giúp ích trong việc cập nhật loại dữ liệu của danh sách Trong thí dụ sau trình bày cách dùng tác vụ đánh số
$numbers[0] +=8;#adds 8 to the
# firts element,list value now
# (12,6,7)
(#numbers[1],#numbers[0] = (3numbers[0],#numbers[1]);
#the first and second element in
# $numbers are switched, list value
#now (6,12,7)
Phương pháp truy xuất phần tử của danh sách dãy dùng ở thí dụ trên được gọi làmột slice Một slice có cấu trúc ngắn như sau :
($number[1] , $number[0]) = @number[1,0]
Biến dãy thay thế biến vô hướng , slice có thể được dùng thay đổi phần tử trong một số danh sách literal của dãy một cách nhanh chóng slice cũng có thể được dùng với biểu thức dãy như :
@hand1 = (3,5,7,10,4);
@hand2 = (5,2,1,3,9);
@kitty = @hànd1[hand2]; #giving
# @kitty the value of @hand1
#[5,2,1,3,9], which movesthe
#literal values to the (3,7,5,10,4)
những giá trị trong @hand2 trở thành giá trị index trong slice @hand2 [@hand2]khi ta đi qua những phần tử của dãy được quy định một trong hai sự điều khiển ( có nghĩa là nhỏ hơn 0 hay lớn hơn giá trị index cuối cùng ) khi ta truy xuất nó chỉ trả về giá trị undef , với undef nó cho tất cả các giá trị vào giữa Một thí dụ của nó là : @images = (4 , 5 , 6 ) ;
$images[3] = “moon”; #tạo biến @images
Trang 12# now (4 , 5 , 6 , “moon”)
$images[5] = “sun”; # sinh ra (4 ,5 ,6 , “moon”, undef ,”sun”)
Lưu ý :
Có những thứ không rõ ràng xảy ra nếu ta gán cho một phần tử nhỏ hơn không
của dãy dùng một tác vụ đánh số
Một mẹo dùng trong truy xuất phần tử là dùng ký hiệu “$#” để tìm ra giá trị index của phần tử cuối cùng trong một biến dãy Nó có định dạng như sau :
@image = (1,2,4,3); # một biến dãy với 4 là giá trị index cuối cùng
$# number = $winner; # cho $winner giá trị 4
Tác vụ Push & Pop
Một cách phổ biến là dùng dãy là để lưu những dữ liệu số lượng lớn Để thuận tiện hơn trong việc thêm bớt các phần tử từ giá trị index cuối cùng của biến dãyPerl dùng các tác vụ Push và Pop Với Push một phần tử mới được thêm vào dãy , vớitác vụ Pop phần tử cuối cùng được đem đi Nó làm việc như sau :
push (@month , $april) ;
thêm giá trị của biến $april vào phần tử cuối trong biến @month
hay :
pop ( @month ) = $last;
phần tử cuối trong @month được chuyển đến biến $last
Nên chú ý cách dùng lệnh Push tương tự như cách viết
@month = (@month , $april); là đúng
Lưu ý :
Trong perl ta có thể giải quyết những vấn đề như trên bằng nhiều cách Ở đây là một trong những khía cạnh tốt nhất của Perl Có thể tuỳ theo ta nhìn vấn đề phải giải quyết như thế nào và ta hiểu về Perl ra nào Nó cũng có thể cung cấp cho ta nhiều chọn lựa hơn là ta cần , chỉ dẫn về sự rắc rối nhiều hơn là ta cần thiết Đừng ngại thử nghiệm với Perl , đó là một trong những cách tốt nhất để biết thêm về ngôn ngữ Perl và ta cũng có thể tạo những công cụ mới để giải quyết vấn đề về nhũng thóiquen không tốt của chúng ta
Một cách khác dùng cho tác vụ Push là thêm một số phần tử mới vào một biến dãy Ví dụ :
@image = (4,5,8);
push (@image,3,8,1); #cho @image giá trị danh sách mới (4,5,8,3, 8,1)
Tác vụ Shift và Unshift
Tương tự như tác vụ Push và Pop, tác vụ Shift và Unshift thêm và loại bỏ phần tử từ dãy, nhưng chúng làm việc bên phía trái hay điểm bắt đầu của những phần tử dãy trong khi Push và Pop làm việc bên phía phải hay ở cuối dãy
Dựa vào những hiểu biết này chúng ta sẽ làm việc như sau :
Trang 13@image = (4,3,6);
unshift (@image,1,8,4); #tạo @image =(1,8,4,4,3,6)
và
$minus = shift (@image); # đem giá trị 1 từ @image
#và đặt nó vào trong $minus
Khi làm việc với những tác vụ Push, Pop, Shift, Unshift, đối số đầu tiên phải làmột biến dãy Nếu như Pop hoặc Shift nhận được một biến dãy rỗng nó sẽ trả về giá trị undef (không xác định)
Tác vụ Reverse
Tác vụ này thực thi đảo thứ tự những phần tử của biến dãy như:
@up = (1,2,3);
@down = reverse (@up); # cho @down giá trị (3,2,1)
Tác vụ reverse loại bỏ nguyên một biến dãy gốc Nếu ta muốn đảo một trật tựcủa biến dãy và dùng nó như là những giá trị mới thì : @up = reverse (@up);
Tác vụ Sort
Tác vụ này là một cách khác để sắp xếp lại các phần tử trong dãy của chúng
ta Sử dụng "sort" sẽ sắp xếp các phần tử theo chiều tăng dần dựa vào bảng mã ASCII Một cách sử dụng điển hình của "sort" là:
@users = sort("Sam","Truong","Hien","Vu");
@alpha_users = @users;
print @alpha_users;
% Hien, Sam,Truong,Vu
Hãy nhớ rằng kí hiệu "%" biểu hiện dòng lệnh của màn hình của Perl Tác vụ
"sort" cũng làm việc với số nhưng dựa trên thứ tự ASCII của chúng chứ không phải theo thứ tự số thông thường, cụ thể là :
@count = (1,2,8,34,67,15);
@count = sort(@count);
print @count;
% 1,15,2,34,67,8
Do đó chúng ta cần phải cẩn thận khi sử dụng tác vụ "sort" đối với số
(number) Perl có thể sắp xếp số, sử dụng sự so sánh thông thường với tác vụ
"sort"
Tác vụ Chop
Khi làm việc với những biến dãy hay trong ngữ cảnh dãy thì tác vụ
"chop"cũng xử lý giống như đối với biến vô hướng Bằng cách dùng tác vụ "chop",chúng ta có thể loại bỏ được kí tự cuối cùng của mỗi phần tử
Ví dụ:
Trang 14@word_guess = ("honk/n"," feed/n"," feathers");
chop @word_guess;
print "You guessed @word_guess";
thì kết quả tại dòng lệnh sẽ là :
% You guessed honk, feed, feather
Như ta thấy, tác vụ "chop" rất hữu dụng trong việc loại bỏ những lệnh "/n" trong toàn dãy
Dãy và <STDIN>
Giống như tác vụ "chop", <STDIN> cũng được dùng với dãy Đối với dãy,
<STDIN> sẽ trả về tất cả những dòng còn lại của tập tin.Mỗi dòng đều được đọc như một phần tử riêng biệt.Trong môi trường xuất nhập của Perl thì <STDIN> có thể được dùng với dãy, ví dụ như :
# word_guess.pl
print "Your guess ? "
@guess = <STDIN> ; # biến guess của người sử dụng được nhập vào #
Và bây giờ ta dùng tác vụ "chop" để loại bỏ "/n" :
chop(@guess); bây giờ @guess = (moo,milk,udder)
Sự tự thêm vào dãy (Array Interpolation)
Chuỗi nháy kép có thể được dùng cùng một cách với dãy như khi chúng làm việc với vô hướng Ví dụ :
@weather = ("sunny","rainy");
$forcast = "Tomorrow will be $weather[0]";
biến $forcast có giá trị thực là "Tomorrow will be sunny"
Khi ta thực hiện công việc tự thêm vào, biểu thức được sử dụng để cho biết chỉsố thì không được xử lý giống như một biến trong chuỗi Điều này có nghĩa là Perl đọc giá trị đầu tiên của một biểu thức như là biểu thức chỉ mục Ví dụ minh họa : @weather = ("sunny","rainy");
$change = (2*2);
$forcast = "The farm has $weather[$change - 1 ]";
biến $forcast sẽ có giá trị thực là : "The farm has mud"
Trang 15giá trị của biến $change không được tính toán trong chuỗi nên giá trị của $change được đọc là 2.
Ta cũng có thể tự thêm vào những danh sách giá trị từ những biến dãy Như vậy một giá trị vô hướng sẽ bao gồm cả danh sách trong đó, ví dụ như :
@pig = ("corn","hay","slop");
$eat = "Pigs like to eat @pig when they are hungry";
print $eat;
% Pigs like to eat corn hay slop when they are hungry
Với một chút khéo léo trong việc sửa chữa,chúng ta có thể chứa những dấu phẩy,dấu chấm câu và khoảng trắng để tạo thành những câu văn có cấu trúc ngữ pháp trong những biến dãy tự thêm vào
Nếu không muốn thêm vào toàn bộ danh sách dãy thì ta có thể dùng một
"slice" để di chuyển những cái ta muốn.Ví dụ :
@pig = ("corn","hay","slop");
$eat = "Pigs like to eat @pig[1,2] when they are hungry";
print $eat;
% Pigs like to eat hay slop when they are hungry
Qua phần này, chúng ta đã biết nhiều về Perl và thao tác văn bản nói chung Chúng ta thật sự bị choáng khi phải phân biệt giữa những biến vô hướng (scalar) vàdãy (array), những biến vô hướng thì chỉ giữ một giá trị trong khi dãy có thể la ømột dãy hoặc một danh sách hoặc những giá trị Cả hai biến vô hướng và dãy đều có những giá trị thực của riêng chúng Những biến này có thể được sửa chữa bằng nhiều tác vụ khác nhau cho dù giá trị thực của chúng là chuỗi (string) hay số (number)
B Lập trình với PERL (Programming with PERL)
1 Biểu thức qui tắc (BTQT)
BTQT là một khái niệm từ Unix Nó như là mẩu, dạng được tương thích dựa trên một chuổi Chuổi là các ký tự có thứ tự trong khi BTQT thử để tạo nên một cặp tương thích là True , False BTQT không là một sự chuyển dịch litteral của chuổi mà là một đại diện của chuổi
Ta nghĩ nó như là từ ngữ để diển tả trong tiếng lóng , ngắn gọn hơn ngôn ngữ thông thường
Ví dụ :
“Yo ! you look fat today” : fat ở đây không phải là mập mà có nghĩa là :looking good
Viết lại:“yo ! you looking good today”
Chìa khoá để dùng BTQT là 2 fold:
+ ta phải hiểu mẩu (pattern) là để thử cho tương thích
+ những mẩu khác nhau có thể được dùng làm nên một mẩu tương thích
Trang 16BTQT được dùng trong một số hệ thống tác vụ khác nhau , bởi những chương trình và những quá trình khác nhau Cú pháp của BTQT khác nhau giữa những hệ thống tác vụ Nhưng những khái niệm vẩn giữ nguyên
2 Cấu trúc điều khiển Perl (CTDK)
Rất quan trọng để chỉ cho chương trình dịch của perl khi ta muốn cái gì sẽ được làm trong Script Để làm điều này ta dùng CTDK như là một lệnh khối , hay là những kiểu khác của việc lặp
4 Lệnh lặp IF/UNLESS
Trong một lệnh lặp if/unless một biểu thức được định ra để kiểm tra cho giá trị true Nếu là true thì làm trong khối lệnh hoặc một lệnh đơn đầu tiên ngay sau if , nếu false làm ngay sau lệnh else
Print “what is the temperature?”;
$temp=<STDIN>;
Chop($temp);
If($temp < 70) {
Trang 17Print “Brop, you better get a sweater!\n”
Print “what is the temperrature ?”$temp = <STDIN>;
Ở đây ta không giới hạn chọn lựa với elsif ,và chúng ta cần bao nhiêu cấu trúc
điều khiển rẽ nhánh thì sẽ có bấy nhiêu
5 Lệnh lặp WHILE/UNTIL
Có thể sớm hoặc trể hơn một lần lặp chổ mà ta cần một khối những lệnh lặp cho đến khi gặp điều kiện hiển nhiên Có thể làm nó với while/until Tiêu biểu là lặp đếm xuống.Ví dụ :
Print “ how ligh for your countdown?”; # where
# the user set the upper limit of the countdown
$count = <STDIN>;
Chop($count);
While ($count < 0) {
Trang 18Print “T minus $count , and counting \n”;
$count ;
}
Lệnh while thực thi cho đến khi giá trị của $count bằng 0 , tác vụ tự động giảm
trên $temp làm nó giảm đi sau mỗi vòng
Lặp while cũng có một lựa chọn để trả về một lệnh nếu điều kiện nhập là false được gọi là lệnh until Vi' dụ :
Print “ how long for your countdow?”;
Lệnh print không được thực thi cho đến khi điều kiện của biến count được thoả
6 Lệnh lặp FOR/FOREACH
Khi ta cần một script để đánh giá một biểu thức và sau đó đánh giá lại trong một countdown fashion Một khuôn mẩu đếm xuống có thể dùng như sau:
For ( $count = 15; $count>= 1; $count ){
Print “ $count \n”;
}
Countdown được in từ 15 đến 1, mỗi số sẽ xuất hiện trên một dòng mới , $countnhận giá trị 15, kiểm tra với điều kiện >= 1 , in ra , và lặp lại cho đến $count = 1 in giá trị cuối cùng
Có thể có trường hợp ta cần tạo một vòng lặp với một biến có giá trị thay đổi trong khi lặp Nhưng ta cần lấy lại giá trị cũ của nó sau khi vòng lặp kết thúc Cần cómột biến cục bộ cho vòng lặp có thể dùng lệnh foreach để làm điều đó
Với foreach một danh sách các giá trị được tạo ra sau đó đặt chúng vào trong biến scala mỗi lần một giá trị và sau đó tính toán Đó là những khối lệnh được thiết kế bởi lệnh foreach Ví dụ :
@letters = (“A”,”B”.”C”,”D”);