Tải bản đầy đủ (.doc) (36 trang)

Ngôn ngữ lập trình PERL

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (166.04 KB, 36 trang )

CHƯƠNG II

NGÔN NGỮ LẬP TRÌNH PERL
----------*P*-----------I .Giới thiệu
1.Perl là gì ?
Theo 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ông
phâ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ọc nà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ác
nà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 vaøo .


Trong khi số và chuổi được xử lý như nhau trong perl thì có một số chi tiết
nhỏ 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ững
kẻ 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ỉ ra
mộ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.
* Chuỗi kí tự:
Perl chấp nhận tập hợp 256 kí tự , mỗi kí tự đượcï biểu diễn bằng 8 bít ï. Nhiều
kí tự hoặc một số chuổị gộp lại làm nên một chuổị kí tự.
Kích thước của một chuổị : Từ không có kí tự nào đến chiều dàị mà bạn mong
muốn. Nó phản ánh một trong những giả thuyết của perl là "không xác lập những
giớị hạn" trong những khả năng khác nhau của nó bất cứ lúc nào có thể.
Khả năng này để xử lí chuổi, không quan tâm đến những kí tự, khi thực hiện
nó 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 đơn vào
bên trong một chuổi (không xữ lý nó _như giới hạn một chuổi), thì ta đặt chuổ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 cho nhữ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ổi sẽ
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 #

2. 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ố :
OPERATOR
+
*
/
**
%
<
<=
==
>=
>

ACTION

Cộng
Trừ
Nhân
Chia
Lũy thừa (Exponentiation)
Chia lấy phần dư (Modulus)
Nhỏ hơn
Nhỏ hơn hay bằng
Equal to
Lớn hơn hoặc bằng
Lớn hơn

Ví dụ
1+2  3
1-2  -1
2*2  4
2/2  1
2**3  8
3.2%3.2  0
2<3
2<=3
2==4/2
3>=2
5>1


!=

Không bằng


5!=1

Khi một trong những tác vụ trên bảng được thực thi, Perl sẽ so sánh và sau đó
trả về giá trị đúng (true) hoặc sai (false).Tuy nhiên những tác vụ đối với chuỗi thì
có khác một chút.
 Tá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 :
OPERATOR
.
Eq
Ne
Lt
Gt
Le
Ge
X

ACTION
Ghép nối
Equal
Not equal
Less than
Greater than

Less than or equal to
Greater than or equal to
String repetititon

Ví dụ
"bi" . "g" => "big"
"small" eq "small"
"small" ne "tiny"
"30" lt "7"
"50" gt "300"
"ten" le "ten"
"eleven" ge "eleven"
"more" x 2 => "moremore"

Chú ý:
Đố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ô hùng có thể thay đổi nhưng biến vô
hù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).
Khoả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).
Ví dụ :
$income=$income - $rent , có thể viết lại dưới dạng gán nhị phân là :
$income -= $rent
Hầu hết bất kì tác vụ nào cũng có thể sử dụng dạng gán nhị phân theo cách
này. Ngoài ra còn có tác vụ tự động tăng một và tự động giảm một . Tác vụ tự
động tăng thì sử dụng kí hiệu ++ . Ví dụ : $debt +=1 thì giống như là : ++$debt
Tác vụ tự động giảm cũng tương tự như vậy nhưng sử dụng kí hiệu -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.
* 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à
$user".
* Với Perl, thì tên biến là tên có thể dài nhất nó có thể tìm thấy, chính vì vậy
chúng ta gặp không í khó khăn trong việc tìm kiếm biến.
Ví dụ :
$old="name_one";
$new="name_two";
$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) .
Khi <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);
($A,1,$B,2,$C,3);
Những biến này không nhất thiết phải là hằng số, nhưng có thể được sửa chữa
thay đổi ngay trong maûng :
($A+1,$B,$C-1);


Perl cũng cung cấp một tác vụ xây dựng một danh sách, thể hiện bởi 2 giai đoạn

giữa 2 giá trị.
Ví dụ :
(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ác giá
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ị trong
danh sách.Những phần tử cũng được sử dụng khi làm việc với những mảng liê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 :
@olduser = ("Sam","Vu");
@newuser = ("Hien","Truong",@olduser);
@alluser = (@newuser,"Jack");
@alluser = ("Mary","Linda",@alluser);
seõ cho danh sách mảng @alluser những giá trị literal sau :
“ Mary,Linda,Hien,Truong,Sam,Vu,Jack ”.
Ta có thể thấy nơi thêm biến mảng vào danh sách riêng của những biến mảng
đặt những giá trị mới vào trước hoặc sau danh sách hiện tại .
Một literal mảng được đặt vào một danh sách mà không có biểu thức cũng có thể

được xử lý như một biến, nhưng một danh sách với những phần tử mảng được thêm
vào thì không thể được xử lý như vậy. Những literal mảng hoạt động như những biến
sẽ giống như 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 vô
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 :
@Z = (“d”,”a”,”v”,”i”,”s”);
print(@Z.” is a magic number\n”);
to output
% 5 is a magic number
LƯU Ý :
Ký hiệu “%” ở đây được dùng để biểu thị cho dòng lệnh trong thiết bị đầu cuối
của Perl , một màn hình đầu cuối trông giống như là màn hình đầu cuối của MS-DOS .
Ký hiệu “%” là đặc trưng tiêu biểu cho chương trình dịch trong cửa sổ đầu cuối giống
DOS để chỉ cho user chổ của dòng lệnh. Perl cũng dùng ký hiệu này cho tác vụ suất
(modul). Do đó không nên nhận những rắc rối giữa Perl scripting (chương trình bẩy lỗi )
dùng ký hiệu “%” và biểu hiện dòng lệnh của Perl với nó .



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ỉ số
đượ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ố .
Ví dụ :
@numbers = (3,5,7);
$pick_one = $number[0];
#this transfers 3 to pick_one
$numbers[0] = 4;
#gives @numbers the
#elemens (4,5,7)
$pick_another = $numbers[2];
#transfers 7 to $pick_another
$numbers[1]++ #autoincriment the
#secondelement in @numbers
$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 = @haø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
# 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ãy Perl
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ới tá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ói quen
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 :
@image = (4,3,6);

unshift (@image,1,8,4); #tạo @image =(1,8,4,4,3,6)
vaø



$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ụ:
@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
#
< STDIN>
% moo
% milk
% udder
và sau đó người sử dụng nhấn Control D để kết thúc chu trình. Điều này sẽ cho
script những giá trị dãy sau :
@guess = ("moo\n","milk\n","udder\n")
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 hoï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"
giá 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 phaà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
BTQT đượ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.
3. Khối lệnh
Cấu trúc đơn giản nhất là khối lệnh . Nó được làm nên từ một dãy các lệnh bao
trong dấu ngoặc đơn { }
Ví dụ :
{
$one=”1”;
@two=(1,2,3);
$three=@two[0];
}
Khi Perl bắt gặp một khối lệnh nó sẽ thực thi liên tục từ lệnh đầu đến lệnh cuối .
Perl sẽ xử lí toàn khối như là một lệnh đơn những khối lệnh thường được dùng như một
phần của những lệnh 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.
Ví dụ :

If (the_expression) {
Statement_if_expression_true;
} else {
Statement_if_expression_false;
}
Vị trí Perl sẽ đánh giá biểu thức là true hay false gọi là biểu thức điều khiển .
Áp dụng nó để chúng ta có thể nhận một script cần liên hệ đến một số user input
sau đó đánh giá nó với những kết quả thu được khác nhau phụ thuộc input nhận được
như :
Print “what is the temperature?”;
$temp=<STDIN>;
Chop($temp);
If($temp < 70) {
Print “Brop, you better get a sweater!\n”
} else {
Print “it is hot enough for ya?\n;
}


Nếu muốn chỉ một lệnh trả về khi kết quả kiểm tra biểu thức là false . Ta có thể
dùng lệnh unless
Ví dụ :
Print “what is the temperature”; $temp=<STDIN>;
Chop($temp);
Unless ($temp < 70) {
Print “ it is hot enough for ya?\n”;
}
Do đó ta chỉ nhận được một lệnh print chỉ khi input được xác định là false.
Một chọn lựa khác của lặp if/else là lệnh elsif . Ta có thể có những chọn lựa riêng
cho việc thực thi của perl do ta đưa vào lệnh elsif thuận tiện cho những chọn lựa khác

nhau như :
Print “what is the temperrature ?”$temp = <STDIN>;
chop ($temp);
If ($temp < 70) {
Print “Brr, you better get a sweater !\n:”;
} elsif (70 < temp < 80) {
Print “a little cool but comfortable .\n”;
} elsif (80 < temp <90) {
Print “nine and cozy ./n”;
} else {
Print “it is host enough for ya?\n”;
}
Ở đâ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) {
Print “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' duï :
Print “ how long for your countdow?”;
$count = <STDIN>;
Chop($count);
Until($count > 0){
Print “ lift off !\n”;
$count--;
}
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 , $count
nhậ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”);
Foreach $new (reverse @letters) {
Print $new;
}

Xuất ra sẽ là D C B A . A một biến đặc biệt của Perl có thể được dùng ở đây để
đơn giản hoá code . Biến scala $_ là biến default đối với một số lệnh như foreach ,
những giá trị có thể được đặt vào nó . Script trên có thể được viết như sau:
@letters = (“A”,”B”.”C”,”D”);
Froeach $_ (reverse @letters) {
Print $_;


}
Nó có thể thu ngắn hơn nữa. Bởi vì Perl sẽ thấy biến $_ , ngay cả nếu nó bị xoá
đi như sau:
@letters = (“A”,”B”.”C”,”D”);
Froeach $ (reverse @letters) {
Print ;
}
Lệnh foreach cũng thuận tiện nếu ta muốn đổi những giá trị của toàn bộ một dãy .
Ví dụ :
@numbers = (2 , 4 , 6 , 8);
Foreach $two (@numbers) {
$two *=2;
}
Nó cho $numbers những giá trị phần tử mới (4 , 8 , 12 , 16) . Chỉ bằng sự thay đổi
biến scala $two ta có thể thay đổi toàn bộ @numbers
7 . Dãy liên kết
Trong Perl dãy liên kết lấy không gian của những kiểu dữ liệu đệ qui khác , như
là cây (trees) được dùng trong những ngôn ngữ máy tính khác .
Những loại dãy này rất quen thuộc đã trình bày ở trước. Một số khác biệt chính
giữa các loại dãy là : một dãy danh sách (list array) có những giá trị index cho những
phần tử của nó là những số nguyên bắt đầu tại 0 và tăng dần đến kết thúc dãy nhưng
ngược lại dãy liên kết dùng những scala một cách tuỳ ý được gọi là những key.

Theo những điều trên thì có nghóa là không được giới hạn để tham khảo đến cho
một phần tử trong một dãy bằng giá trị index của nó dựa trên số integer . Nhưng ta có
thể chọn bất cứ giá trị gì để liên kết với phần tử của dãy nó rất bình thường và rất tốt
để liên kết những chuổi với những phần tử đặc thù của dãy bằng cách này .
Một mô hình tốt hơn để hiểu biết nhiều hơn về dãy liên kết có thể làm việc như
thế nào là một ROLODEX . Những tên mới, những số điện thoại mới được ghi vào
những card tách biệt được đưa vào từng tên một trong vùng ngữ nghóa của rolodex . Khi
ta muốn tìm ra số phone của người bạn mới ta đi đến letter tên của người bạn đó đã
được đưa vào để tìm số phone đó.
Với dãy liên kết những tên mới , số điện thoại là những giá trị scala . Trong khi
những letter trên những rolodex card bản thân chúng là những key để tìm những giá trị ,
ta tìm key đến giá trị đó như là tìm số điện thoại dùng những letter.
Dãy liên kết dùng một biến trong format sau: $variable _name
Không giống những biến danh sách dãy, dãy liên kết thường được tham khảo đến
với những key của nó .Ví dụ :
%month = (
"'Jan', 'January,'"


"'Feb', 'Ferbruary,'"
"'Feb', 'Ferbruary,'"
"'Mar', 'March,'"
"'Apr', 'April',"
"'May', 'May',"
"'Jun', 'June',"
"'Jul', 'Jul',"
"'Aug', 'August',"
"'Oct', 'October',"
"'Nov', 'November',"
"'Dec', 'December',"

);
Những dấu nháy đơn và nháy kép có hiệu lực như trong những danh sách dãy .
Nếu ta muốn đánh số cho một dãy liên kết quá trình cũng tương tự như là đánh số
ở danh sách dãy nhưng dấu ngoặc đơn được thay cho dấu ngoặc vuông do vậy :
#a simple array (dãy đơn giản)
@wolf = (4 , 5 , 6);
@wolf[3] = “moon”; # tạo @wolf
# lúc này @wolf = ( 4, 5, 6, “moon”)
@wolf[5] = “howl” # producing (sinh ra)
#(4, ,5, 6, “moon”, undef, “howl”)
Trở thành một dãy liên kết thích hợp như sau:
%wolf = (4, “four” , 5 , “five” , 6 , “six”);
Ví dụ :
%wolf = (4,”four”,5,”five”,6,”six”);
$wolf{4} – “moon;
#making
%wolf
#now (4,”moon,5,”howl”,6,”six”)
$wolf{5} = “howl”;
#producing
%wolf values
# (4,”moon”,5,”howl”,6,”six”)
Đặc điểm đó luôn luôn có số phần tử tương ứng trong một dãy liên kết . Đó là một
giá trị và một key của nó . Mặt khác giá trị hay là key khuyết được mang giá trị undef.


Khi ta gọi những giá trị của một dãy liên kết không có literal tương đương nào như
đã có trong những danh sách dãy . Để thay thế nó , ngay tại thời điểm đó Perl tạo ra
một chuổi những cặp key/value trong bất kỳ một thứ tự nào dể nhất tại lúc đó phụ
thuộc vào từng giai đoạn của moon (Perl tạo danh sách literal của những cặp giá trị dựa

trên cái gì nhanh nhất tại thời điểm đó và dựa vào nơi ta đang ở trong Script đó . Do đó
mỗi lần ta xác định một danh sách literal trật tự sẽ khác biệt không đáng kể ).
=> Dãy liên kết cũng có những tác vụ riêng của nó :
a. Tác vụ Key :
Để lấy một danh sách những key hiện hành của dãy liên kết . Đặt tên của dãy
trong dấu ngoặc đơn sau lệnh keys :
Key(%wolf); # which would create the key/value list (4, 5 , 6 ) ,or
#somthing similar since the order does not have to remain the same
Chổ dùng những dấu ngoặc đơn là những chọn lựa .
b. Tác vụ Values:
Tác vụ values làm việc như tác vụ keys ngoại trừ nó trả về một danh sách những
giá trị của một dãy.Ví dụ :
Values(%wolf); # creates (khởi tạo)
# ( “moon” , “howl” , “six”) =>
Trật tự không có cá biệt.
c. Tác vụ Each :
Để xem xét tất cả những phần tử của một dãy liên kết ta có thể dùng tác vụ each
Each(%wolf);
Nó sẽ trả về cặp giá trị key/value đầu tiên trong dãy:
% 4 , moon , 5 , howl , 6 , six
d. Tác vụ Delete :
Tác vụ này cho phép ta remove những cặp giá trị bằng cách chỉ định key của cặp
mà ta muốn remove :
%wolf = (4 ,”four”, 5 ,”five” , 6 ,”six”);
Delete $wolf{5};
# trả về một phần tử danh sách cho
# %wolf là (4 , “four” , 6 ,”six”)
8. Nhập / xuất (I/O _ Input/Output)
Ta đã biết dùng <STDIN> để lấy một dòng của user input và lưu nó như một giá
trị biến scalar. Chúng ta cũng biết có thể đặt nhận của user input từ <STDIN> vào trong

một dãy , mỗi dòng đưa vào được giữ như những phần tử riêng biệt trong những cặp
key/value của dãy nhưng chúng ta chưa thực sự tập trung vào việc thao tác trên những
giá trị này như thế nào .


Nếu ta muốn đi suốt mỗi dòng và thay đổi một ít trong đó có thể làm điều đó
bằng cách tạo một vòng lặp đơn giản như :
While ( $_ = <TSDIN> ) {
}
Lệnh while tạo nên một vòng lặp . Perl sẽ đặt những dòng trong <STDIN> vào
trong biến scalar $_ cho đến khi file chạy hết những dòng đó thì vòng lặp kết thúc .
Khi dùng Perl để xuất ra ngoài thông thường cả hai tác vụ print và printf đều có
thể ghi vào <STDOUT> . Tác vụ print có thể làm nhiều hơn là chỉ sinh ra văn bản để
hiển thị ; nó hoạt động như một tác vụ list và có thể di chuyển một chuổi trong
<STNOUT> mà không cộng thêm một ký tự nào .
Tác vụ printf cho ta nhiều lệnh về chuổi hơn là lệnh print , với printf ta có thể chỉ
định một chuổi điều khiển định dạng với đối số đầu tiên , nó sẽ xác định phần những
đối số còn lại sẽ được in ra như thế nào . Một thí dụ:
Printf “%10 %20” , $wolf , $moon;
$wolf sẽ được in đến một field 10 ký tự và $moon sẽ được in đến một field 20 ký tự
Có những bổ sung khác có thể được dùng với tác vụ printf nó có thể chỉ định
một chuổi được in như một số nguyên hệ 10 (decimal integer) , giá trị dấu chấm động
(foating-point value), những khoảng trống hay là những tab.
9. Cách dùng biểu thức qui tắc :
Để trình bày một cách dùng BTQT một cách dễ dàng Perl cho ta một lệnh đơn
giản được gọi là grep . Thu gọn cho sự in BTQT toàn cục. Grep là một lệnh xuất xứ từ
UNIX nó rất hữu ích . Với grep ta có thể lấy một BTQT và tìm kiếm một file từng dòng
một (line by line), thử tương thích với chuổi được chỉ định trong BTQT đó . Dùng grep ở
dòng lệnh có thể xem như sau :
Grep crypt bonus.pl

% bonus_change.pl
Grep sẽ kiểm tra tất cả các dòng mã trong bonus.pl để xem nếu nó chứa chuổi
“crypt” thì xuất những dòng đó vào trong file bonus_change.pl theo đường <STDOUT>.
Để biểu thị chuổi “crypt” như một BTQT trong Perl thì nó phải được bao giữa
những / (slashes) như : / crypt /
Và trong script nó sẽ giống như sau:
If (/ crypt / ) {
Print “$_”;
}
BTQT crypt được kiểm tra dựa vào biến đặc biệt $_ ,($_ là biến scalar mặc định)
tại đó tất cả mọi thứ được lưu ngay lúc đó hoặc lúc khác .
Có một số biến đặc biệt trong Perl , như $_ , có những điểm đặc trưng được chỉ
định riêng của chúng được thiết kế để làm cho Perl dể sử dụng hơn .
10. GUESTBOOK :


Hãy bắt đầu với một thí dụ đơn giản của một Guestbook dùng trong Perl . Trước
tiên bạn sẽ cần tạo một file Perl gọi là guest.pl
Lưu ý: Bạn có thể viết perl script trong một số ứng dụng xử lí văn bản , như notepab,
write, word... Tuỳ bạn mong muốn . Sau khi tạo perl script bạn nhớ lưu script của bạn
với đuôi mở rộng là .pl
Để giữ cho việc lập trình tốt , dòng đầu tiên của script sẽ là dòng chú thích tên
của file . Nó rất thuận tiện khi ta hay một người nào đó làm việc với file sau này .
Script như sau :
#! Usr/bin/perl
# guest.pl
Print "What is your name ? ";
$name - <STDIN>: # get the response
# from the user
Open (GUESTBOOK, ">> guest.pl ");

#open a file with
#filehandle GUESTBOOK
Print GUESTBOOK "$name": #append
#the name to the guestbook file
Chop($name) ; #remove the newline
Print "Thank you. $name! Your name has been added to the UESTBOOK.\n"
Close(GUESTBOOK);
Script trên làm những gì ? Đầu tiên in một dấu nhắc (prompt) cho user . Trong
trường hợp này lệnh print sẽ là mặc định cho <STDOUT> ra màn hình . Sau đó đặt <>
để gọi một hàng từ file điều khiển <STDIN> . Hàng đó là nhập từ bàn phím cho đến
một hàng mới , kế đó mở một file tên guest.pl , file này được gán cho một file điều
khiển (filehandle) của GUESTBOOK file điều khiển được dùng tham khảo đến file đã
mở để đọc hoặc ghi và nó thường toàn là chữ hoa . File điều khiển này giống như tất cả
các biến hay các dãy trong Perl có thể chỉ là về một số thứ mà ta muốn , miễn là nó
không phải là một từ đảo. Ta nên chú ý đặt >> vào trước tên file có nghóa là chúng ta
sẽ mở file đó để thêm vào . Những chọn lựa cho việc mở file nằm trong bảng 3.1
Bảng 3.1 :
OPERATOR
ACTION
>
Write
>>

Append {theâm}

+>

Read and write

Nothing


Read


Mổi lần mở một file và chúng ta có một file điều khiển , ta có thể đặt tên trong
guestbook file với lệnh print . Lưu ý ta làm điều đó bằng cách đặt file điều khiển vào
trực tiếp ngay sau lệnh print . Trong thực tế lệnh print “string “ thông thường là một
phiên bản (version) ngắn gọn thật sự của : Print <STDOUT> “string”;
Ta in dòng kế ra màn hình , đặt biến $name vào bên trong chuổi đó và nó sẽ được
in ra như ta đã nhập vào , nó được gọi là sự tự thêm vào của biến , biến này đã được
thay thế trong chuổi trước khi nó được in ra .
Lệnh chop( ) được gọi để loại bỏ ký tự cuối trong chuổi $name trước khi in . Nó
được dùng loại bỏ dòng mới (newline) được nối vào chuổi khi nó được nhập từ bàn
phím. Nếu như ta không làm điều đó ta sẽ kết thúc với một dòng mới đặc biệt được in
bên phải sau name và một dấu chấm than ở trên một dòng , không như mong muốn về
mặt ngữ pháp . Ta bỏ newline trên khi ta in nó ra file vì ta muốn mỗi name nằm trên
một dòng riêng của nó .
Cuối cùng ta đóng file và kết thúc chương trình . Ta không thật sự cần thiết phải
đóng file vì Perl sẽ tự động đóng nó nếu nó được mở lại hoặc chương trình đó kết thúc
nhưng để lập trình tốt nên đặt lệnh kết thúc ở đó .
Bây giờ chúng ta đã có một cơ sở dữ liệu đầy đủ về tên của những người khách
(guest) . Kế tiếp là gì ?
Bước luận lý kế tiếp sẽ là kiểm tra file để xem nếu ta đã kiểm cơ sở dữ liệu đó nó
chưa được lấp đầy với những khách (customers) lặp . Procedure trong listing 3.1 chỉ ta
làm thế nào.
Hãy xem vai trò mới . Vòng while sẽ tiếp tục cho đến khi điều kiện là false . Điều
kiện trong trường hợp này là gán $line cho mỗi dòng của GUESTBOOK . Kết thúc với
một dòng mới.
Listing 3.1 :
Checking the file chop($name);

# remove the new line
print ” Thank you, $name! Your name has been added to the Guestbook.\n”;
Close(GUESTBOOK);
Print(What is your name?”);
$name=<STDIN>;
Get the response
# from the use
Open (GUESTBOOK, “guest .pl”);
#open a file with filehandle GUESTBOOK
While ($line=<GUESTBOOK>)
{
If($line eq $name)
{


Print”Your name is already in the guestbook!\n”;
Close(GUESTBOOK);
Exit;
}

}
Close (GUESTBOOK ) ; # Close file
Open (GUESTBOOK, “>>guest.pl”);
# open same file for append
Print GUESTBOOK “$name”: #append
# the same to the Guestbook file
Chop($name);
# $name ! Your name has been added to the Guestbook. \n;
Close(GUESTBOOK);


Chuùng ta thực thi procedure này khi ta nhận tên của khách (guest) , bây giờ ta thu
nhận nó từ một file đúng hơn là từ <STDIN> . Điều kiện trên sẽ tiếp tục là true cho đến
khi không còn dòng nào trong file . Chú ý ta mở file guest.pl để đọc, do đó ta có thể lấy
được những dòng trong đó .
Điều kiện if so sánh mỗi $line với $name . đây ta dùng tác vụ eq vì những biến
là chuổi . Nếu những biến đó là số ta sẽ dùng tập hợp những tác vụ so sánh khác . Bởi
vì Perl không phân biệt giữa biến chuổi và biến số , ta phải thận trọng với những tác vụ
so sánh mà chúng ta dùng . Perl sẽ so sánh “5” and “10” khác nhau phụ thuộc vào ta
dùng một tác vụ chuổi hay số . “5” sẽ nhỏ hơn “10” trong ý nghóa số học, nhưng trong
ngữ cảnh chuổi thì nó sẽ lớn hơn “10”.
Một ghi nhanh trên tác vụ so sánh : nó sẽ trả về –1 nếu nó là nhỏ hơn , trả về +1
nếu nó là lớn hơn
Lệnh exit trong thân của lệnh if sẽ dừng chương trình sau khi cung cấp tin tức cho
user là tên của người đó đã nằm trong guestbook . Chúng ta sẽ thực hiện tương tự trong
một dòng với lệnh die:
If ($line eq $name) {
Die “your name is already in the guestbook!\n”;
}
Bảng liệt kê những tác vụ có thể cho cả hai ngữ cảnh chuổi và số :


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×