Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Perl và các khái niệm cơ bản
Nội dung xem thử
Mô tả chi tiết
Lêi giíi thiÖu
Cuèn s¸ch nµy nãi vÒ g×
1: Giíi thiÖu
LÞch sö cña Perl
Môc ®Ých cña Perl
Nh÷ng ®iÒu cã s½n
Hç trî
C¸c kh¸i niÖm c¬ b¶n
D¹o qua Perl
Bµi tËp
2:D÷ liÖu v« híng
D÷ liÖu v« híng lµ g×?
Sè
X©u
To¸n tö
BiÕn v« híng
To¸n tö trªn biÕn v« híng
<STDIN> nh gi¸ trÞ v« híng
§a ra víi print()
Gi¸ trÞ undef
Bµi tËp
3: D÷ liÖu m¶ng vµ danh s¸ch
M¶ng lµ g×?
BiÓu diÔn h»ng kÝ hiÖu
BiÕn
To¸n tö
V« híng vµ ng÷ c¶nh m¶ng
<STDIN> nh mét m¶ng
Néi suy biÕn thiªn cña m¶ng
Bµi tËp
4: CÊu tróc ®iÒu khiÓn
Khèi c©u lÖnh
C©u lÖnh if/unless
C©u lÖnh while/until
C©u lÖnh for
C©u lÖnh foreach
Bµi tËp
5: M¶ng kÕt hîp
M¶ng kÕt hîp lµ g×?
BiÕn m¶ng kÕt hîp
BiÓu diÔn h»ng kÝ hiÖu cho m¶ng kÕt hîp
To¸n tö m¶ng kÕt hîp
Bµi tËp
6: Vµo/ra c¬ së
§a vµo tõ STDIN
§a vµo tõ to¸n tö h×nh thoi
§a ra STDOUT
Bµi tËp
7: BiÓu thøc chÝnh qui
Kh¸i niÖm vÒ biÓu thøc chÝnh qui
C¸ch dïng ®¬n gi¶n vÒ biÓu thøc chÝnh qui
MÉu
Nãi thªm vÒ to¸n tö ®èi s¸nh
PhÐp thÕ
C¸c to¸n tö split(0 vµ join()
Bµi tËp
8: Hµm
C¸c hµm hÖ thèng vµ ngêi dïng
§Þnh nghÜa hµm ngêi dïng
Gäi hµm ngêi dïng
Cho l¹i gi¸ trÞ
§èi
BiÕn côc bé trong hµm
Bµi tËp
9: C¸c cÊu tróc ®iÒu khiÓn
To¸n tö last
To¸n tö next
To¸n tö redo
Khèi cã nh·n
Bé söa ®æi biÓu thøc
&&, || vµ ?: xem nh c¸c cÊu tróc ®iÒu khiÓn
Bµi tËp
10: Gi¶i quyÕt tÖp vµ kiÓm thö tÖp
Tíc hiÖu tÖp lµ g×?
Më vµ ®ãng mét tíc hiÖu tÖp
Mét chót tiªu khiÓn: die()
Dïng tíc hiÖu tÖp
KiÓm tra tÖp -x
To¸n tö stat() vµ lstat()
Dïng _Filehandle
Bµi tËp
11: §Þnh d¹ng
§Þnh d¹ng lµ g×?
X¸c ®Þnh mét ®Þnh d¹ng
Gäi mét ®Þnh d¹ng
Nãi thªm vÒ Fieldholder
§Þnh d¹ng ®Ønh trang
§æi gi¸ trÞ mÆc ®Þnh cho ®Þnh d¹ng
Bµi tËp
12: Th©m nhËp danh môc
§i vßng quanh c©y danh môc
Globbing
Gi¶i quyÕt danh môc
Më vµ ®ãng bé gi¶i quyÕt danh môc
§äc bé gi¶i quyÕt danh môc
Bµi tËp
13: Thao t¸c tÖp vµ danh môc
Lo¹i bá tÖp
§æi tªn tÖp
T¹o ra tªn thay phiªn cho mét tÖp (liªn kÕt)
T¹o ra vµ xo¸ danh môc
Söa ®æi phÐp dïng
Söa ®æi quyÒn dïng
Söa ®æi thêi h¹n
Bµi tËp
14: Qu¶n lÝ tiÕn tr×nh
Dïng system() vµ exec()
Dïng Backquotes
Dïng Proceses vµ Filehandles
Dïng folk
Tãm t¾t vÒ c¸c phÐp to¸n tiÕn tr×nh
Göi vµ nhËn tÝn hiÖu
Bµi tËp
15: BiÕn ®æi d÷ liÖu kh¸c
T×m x©u con
TrÝch vµ thay thÕ x©u con
§Þnh d¹ng d÷ liÖu b»ng sprintf()
S¾p xÕp cao cÊp
ChuyÓn tù
Bµi tËp
16: Th©m nhËp c¬ së d÷ liÖu hÖ thèng
LÊy mËt hiÖu vµ th«ng tin nhãm
§ãng vµ më gãi d÷ liÖu nhÞ ph©n
LÊy th«ng tin m¹ng
LÊy th«ng tin kh¸c
Bµi tËp
17: Thao t¸c c¬ së d÷ liÖu ngêi dïng
C¬ së d÷ liÖu DBM vµ m¶ng DBM
Më vµ ®ãng m¶ng DBM
Dïng m¶ng DBM
C¬ së d÷ liÖu th©m nhËp ngÉu nhiªn chiÒu dµi cè ®Þnh
C¬ së d÷ liÖu chiÒu dµi biÕn thiªn (v¨n b¶n)
Bµi tËp
18: ChuyÓn c¸c ng«n ng÷ kh¸c sang Perl
ChuyÓn Ch¬ng tr×nh awk sang Perl
ChuyÓn Ch¬ng tr×nh sed sang Perl
Bµi tËp
A: Tr¶ lêi bµi tËp
B: C¬ së vÒ nèi m¹ng
M« h×nh chç c¾m
Kh¸ch mÉu
Bé phôc vô mÉu
C: Nh÷ng chñ ®Ò cha ®Ò cËp tíi
Bé gì lçi
Dßng lÖnh
C¸c to¸n tö kh¸c
NhiÒu, nhiÒu hµm n÷a
NhiÒu, nhiÒu biÕn ®Æt s½n n÷a
X©u ë ®©y
return (tõ ch¬ng tr×nh con)
To¸n tö eval (vµ s///e)
Thao t¸c b¶ng kÝ hiÖu víi *FRED
To¸n tö goto
To¸n tö require
Th viÖn
Perl b¶n 5.0 Goodies
ChØ môc
1
Giíi thiÖu
LÞch sö Perl
Perl lµ c¸ch viÕt t¾t cho “Practical Extraction and Report Language” Ng«n ng÷
b¸o c¸o vµ trÝch rót thùc hµnh, mÆc dÇu nã còng cßn ®îc gäi lµ “Pathologically
Eclectic Rubbish Lister” - Bé lµm danh s¸ch chiÕt trung bËy b¹ vµ bÖnh ho¹n.
Ch¼ng Ých g× mµ biÖn minh xem c¸ch gäi nµo ®óng h¬n, v× c¶ hai ®Òu ®îc Larry
Wall, ngêi s¸ng t¹o vµ kiÕn tróc s chÝnh, ngêi cµi ®Æt vµ b¶o tr× cña Perl chÊp nhËn.
¤ng Êy ®· 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 lµm x× hÕt
h¬i. Larry, mét ngêi lËp tr×nh lêi biÕng, quyÕt ®Þnh thanh to¸n vÊn ®Ò nµy b»ng
mét c«ng cô v¹n n¨ng mµ anh cã thÓ dïng Ýt nhÊt còng ë mét n¬i kh¸c. KÕt qu¶ lµ
b¶n ®Çu tiªn cña Perl.
Say khi ch¬i víi b¶n ®Çu nµy cña Perl mét chót, thªm chÊt liÖu ®©y ®ã, Larry
®a nã cho céng ®ång ®éc gi¶ Usenet, thêng vÉn ®îc gäi lµ “the Net”. Ngêi dïng
thuéc to¸n phï du nghÌo khã vÒ hÖ thèng trªn toµn thÕ giíi (qu·ng ®é chôc ngh×n
ngêi) ®a l¹i cho anh ph¶n håi, hái c¸ch lµm thÕ nµy thÕ kia, viÖc nµy viÖc kh¸c,
nhiÒu ®iÓm mµ Larry cha bao giê mêng tîng ra vÒ viÖc gi¶i quyÕt cho Perl nhá bÐ
cña m×nh c¶.
Nhng kÕt qu¶ lµ Perl trëng thµnh, trëng thµnh vµ trëng thµnh thªm n÷a, vµ
còng cïng tØ lÖ nh lâi cña UNIX. (víi b¹n lµ ngêi míi, toµn bé lâi UNIX ®îc dïng
chØ khÝt vµo trong 32K! Vµ b©y giê chóng ta may m¾n nÕu ta cã thÓ cã ®îc nã díi
mét vµi mega.) Nã ®· trëng thµnh trong c¸c tÝnh n¨ng. Nã ®· trëng thµnh trong
tÝnh kh¶ chuyÓn. §iÒu mµ cã thêi lµ mét ng«n ng÷ tÝ tÑo b©y giê ®· cã tµi liÖu sö
dông 80 trang, mét cuèn s¸ch cña Nutshell 400 trang, mét nhãm tin Usenet víi 40
ngh×n thuª bao, vµ b©y giê lµ ®o¹n giíi thiÖu nhÑ nhµng nµy.
Larry vÉn lµ ngêi b¶o tr× duy nhÊt, lµm viÖc trªn Perl ngoµi giê khi kÕt thóc
c«ng viÖc thêng ngµy cña m×nh. Vµ Perl th× vÉn ph¸t triÓn.
Mét c¸ch ®¹i thÓ th× lóc mµ cuèn s¸ch nµy ®¹t tíi ®iÓm dõng cña nã, Larry sÏ
®a ra b¶n Perl míi nhÊt, b¶n 5.0, høa hÑn cã mét sè tÝnh n¨ng thêng hay ®îc yªu
cÇu, vµ ®îc thiÕt kÕ l¹i tõ bªn trong trë ra. (Larry b¶o t«i r»ng kh«ng cßn mÊy
dßng lÖnh tõ lÇn ®a ra tríc, vµ sè Êy cø ngµy cµng Ýt ®i mçi ngµy.) Tuy nhiªn, cuèn
s¸ch nµy ®· ®îc thö víi Perl b¶n 4.0 (lÇn ®a ra gÇn ®©y nhÊt khi t«i viÕt ®iÒu nµy).
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Õ,
ch¬ng tr×nh Perl 1.0 vÉn lµm viÖc tèt víi nh÷ng b¶n gÇn ®©y, ngo¹i trõ mét vµi
Trong ch¬ng nµy:
• LÞch sö Perl
• Môc ®Ých cña Perl
• Cã s½n
• Hç trî
• C¸c kh¸i niÖm c¬ b¶n
• D¹o qua vÒ Perl
thay ®æi l¹ cÇn cho sù tiÕn bé.
Môc ®Ých cña Perl
Perl ®îc thiÕt kÕ ®Ó trî gióp cho ngêi dïng UNIX víi nh÷ng nhiÖm vô th«ng
dông mµ cã thÓ rÊt nÆng nÒ hay qu¸ nhËy c¶m víi tÝnh kh¶ chuyÓn ®èi víi tr×nh
vá, vµ còng qu¸ k× l¹ hay ng¾n ngñi hay phøc t¹p ®Ó lËp tr×nh trong C hay mét
ng«n ng÷ c«ng cô UNIX nµo kh¸c.
Mét khi b¹n trë nªn quen thuéc víi Perl, b¹n cã thÓ thÊy m×nh mÊt Ýt thêi gian
®Ó lÊy ®îc trÝch dÉn tr×nh vá (hay khai b¸o C) ®óng, vµ nhiÒu thêi gian h¬n ®Ó ®äc
tin trªn Usenet vµ ®i trît tuyÕt trªn ®åi; v× Perl lµ mét c«ng cô lín tùa nh chiÕc ®ßn
bÈy. C¸c cÊu tróc chÆt chÏ cña Perl cho phÐp b¹n t¹o ra (víi tèi thiÓu sù om sßm
nhÆng sÞ) mét sè gi¶i ph¸p cã u thÕ rÊt trÇn lÆng hay nh÷ng c«ng cô tæng qu¸t.
Còng vËy, b¹n cã thÓ l«i nh÷ng c«ng cô nµy sang c«ng viÖc tiÕp, v× Perl lµ kh¶
chuyÓn cao ®é vµ l¹i cã s½n, cho nªn b¹n sÏ cã nhiÒu thêi gian h¬n ®Ó ®äc tin
Usenet vµ trît tuyÕt.
Gièng nh mäi ng«n ng÷, Perl cã thÓ “chØ viÕt” - tøc lµ cã thÓ viÕt ra ch¬ng
tr×nh mµ kh«ng thÓ nµo ®äc ®îc. Nhng víi sù chó ý ®óng ®¾n, b¹n cã thÓ tr¸nh ®îc
sù kÕt téi th«ng thêng nµy. Qu¶ thÕ, ®«i khi Perl tr«ng nh næi tiÕng víi nh÷ng c¸i
kh«ng quen thuéc, nhng víi ngêi lËp tr×nh ®· th¹o Perl, nã tùa nh nh÷ng dßng cã
tæng kiÓm tra víi mét sø mÖnh trong cuéc ®êi. NÕu b¹n tu©n theo nh÷ng híng dÉn
cña cuèn s¸ch nµy th× ch¬ng tr×nh cña b¹n sÏ dÔ ®äc vµ dÔ b¶o tr×, vµ chóng cã lÏ
sÏ kh«ng th¾ng trong bÊt k× cuéc tranh luËn Perl khã hiÓu nµo.
TÝnh s½n cã
NÕu b¹n nhËn ®îc
Perl: not found
khi b¹n thö gäi Perl tõ líp vá th× ngêi qu¶n trÞ hÖ thèng cña b¹n còng ch¼ng lªn
c¬n sèt. Nhng thËm chÝ nÕu nã kh«ng cã trªn hÖ thèng cña b¹n, th× b¹n vÉn cã thÓ
lÊy ®îc nã kh«ng mÊt tiÒn (theo nghÜa “¨n tra kh«ng mÊt tiÒn”).
Perl ®îc ph©n phèi theo phÐp c«ng céng GNU, nghÜa lµ thÕ nµy, “b¹n cã thÓ
ph©n ph¸t ch¬ng tr×nh nhÞ ph©n Perl chØ nÕu b¹n lµm ra ch¬ng tr×nh gèc cã s½n cho
mäi ngêi dïng kh«ng ph¶i tr¶ tiÒn g× c¶, vµ nÕu b¹n söa ®æi Perl, b¹n ph¶i ph©n
ph¸t ch¬ng tr×nh gèc cña b¹n cho n¬i söa ®æi cña b¹n n÷a.” Vµ ®ã lµ b¶n chÊt cña
cho kh«ng. B¹n cã thÓ lÊy ch¬ng tr×nh gèc cña Perl víi gi¸ cña mét b¨ng tr¾ng hay
vµi mªga byte qua ®êng d©y. Vµ kh«ng ai cã thÓ kho¸ Perl vµ b¸n cho b¹n chØ m·
nhÞ ph©n víi ý tëng ®Æc biÖt vÒ “cÊu h×nh phÇn cøng ®îc hç trî”.
Trong thùc tÕ, nã kh«ng chØ lµ cho kh«ng, nhng nã ch¹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Þch C. §Êy lµ v×
bé tr×nh nµy tíi víi b¶n viÕt cÊu h×nh bÝ quyÕt ®îc gäi lµ CÊu h×nh, c¸i sÏ mãc vµ
chäc vµo c¸c danh môc hÖ thè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, chuyÓn cho b¹n viÖc kiÓm
chøng ph¸t hiÖn cña nã.
Bªn c¹nh c¸c hÖ thèng UNIX hay tùa UNIX, ngêi ®· bÞ nghiÖn Perl ®em nã
sang Amiga, Atari ST, hä Macintosh, VMS, OS/2, thËm chÝ MS/DOS - vµ cã lÏ
cßn nhiÒu h¬n n÷a vµo lóc b¹n ®äc cuèn s¸ch nµy. VÞ trÝ chÝnh x¸c vµ sù cã s½n
cña nh÷ng b¶n Perl nµy th× biÕn ®éng, cho nªn b¹n ph¶i hái quanh (trªn nhãm tin
Usenet ch¼ng h¹n) ®Ó cã ®îc th«ng tin míi nhÊt. NÕu b¹n hoµn toµn kh«ng biÕt g×,
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 & Associates/ Random
House Co., 1993).
Hç trî
Perl lµ con ®Î cña Larry Wall, vµ vÉn ®ang ®îc anh Êy n©ng niu. B¸o c¸o lçi vµ
yªu cÇu n©ng cao nãi chung ®Òu ®îc söa ch÷a trong c¸c lÇn ®a ra sau, nhng anh Êy
còng ch¼ng cã nghÜa vô nµo ®Ó lµm bÊt k× c¸i g× víi chóng c¶. Tuy thÕ Larry thùc
sù thÝch thó nghe tõ tÊt c¶ chóng ta, vµ còng lµm viÖc thùc sù ®Ó thÊy Perl ®îc
dïng trªn qui m« thÕ giíi. E-mail trùc tiÕp cho anh Êy nãi chung ®Òu nhËn ®îc tr¶
lêi (cho dï ®Êy chØ ®¬n thuÇn lµ m¸y tr¶ lêi email cña anh Êy), vµ ®«i khi lµ sù ®¸p
øng con ngêi.
Ých lîi h¬n viÖc viÕt th trùc tiÕp cho Larry lµ 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 comp.lang.perl. NÕu b¹n cã thÓ göi
email trªn Internet, nhng cha vµo Usenet, th× b¹n cã thÓ tham gia nhãm nµy b»ng
c¸ch göi mét yªu cÇu tíi [email protected], yªu cÇu sÏ tíi mét ngêi
cã thÓ nèi b¹n víi cöa khÈu email hai chiÒu trong nhãm, vµ cho b¹n nh÷ng høong
dÉn vÒ c¸ch lµm viÖc.
Khi b¹n tham gia mét nhãm tin, b¹n sÏ thÊy ®¹i lo¹i cã kho¶ng 30 ®Õn 60 “th”
mçi ngµy (vµo lóc b¶n viÕt nµy ®îc so¹n th¶o) trªn ®ñ mäi chñ ®Ò tõ c©u hái cña
ngêi míi b¾t ®Çu cho tíi vÊn ®Ò chuyÓn ch¬ng tr×nh phøc t¹p vµ vÊn ®Ò giao diÖn,
vµ thËm chÝ c¶ mét hay hai ch¬ng tr×nh kh¸ lín.
Nhãm tin gÇn nh ®îc nh÷ng chuyªn gia Perl ®iÒu phèi. PhÇn lín thêi gian, c©u
hái cña b¹n ®Òu cã sù tr¶ lêi trong vßng vµi phót khi bµi tin b¹n tíi tñ nèi Usenet
chÝnh. B¹n h·y thö møc ®é hç trî tõ nhµ s¶n xuÊt phÇn mÒm m×nh a chuéng vÒ
viÖc cho kh«ng nµy! B¶n th©n Larry còng ®äc vÒ nhãm khi thêi gian cho phÐp, vµ
®«i khi ®· xen c¸c bµi viÕt cã thÈm quyÒn vµo ®Ó chÊm døt viÖc c·i nhau hay lµm
s¸ng tá mét vÊn ®Ò. Sau rèt, kh«ng cã Usenet, cã lÏ kh«ng thÓ cã chç ®Ó dÔ dµng
c«ng bè Perl cho c¶ thÕ giíi.
Bªn c¹nh nhãm tin, b¹n còng nªn ®äc t¹p chÝ Perl, ®i cïng viÖc ph©n phèi Perl.
Mét nguån cã thÈm quyÒn kh¸c lµ cuèn s¸ch Programming Perl cña Larry Wall
vµ Randal L. Schwatrz (O’Reilly & AssociatÐ, 1990). Programming Perl ®îc xem
nh “S¸ch con lõa” v× b×a cña nã vÏ con vËt nµy (hÖt nh cuèn s¸ch nµy cã lÏ sÏ ®îc
biÕt tíi víi tªn s¸ch l¹c ®µ kh«ng bíu). S¸ch con lõa chøa th«ng tin tham kh¶o ®Çy
®ñ vÒ Perl díi d¹ng ®ãng gän gµng. S¸ch con lõa còng bao gåm mét b¶ng tra tham
kh¶o bËt ra tµi t×nh mµ chÝnh lµ nguån a chuéng cña c¸ nh©n t«i vÒ th«ng tin Perl.
C¸c kh¸i niÖm c¬ b¶n
Mét b¶n viÕt vá kh«ng g× kh¸c h¬n lµ mét d·y c¸c lÖnh vá nhåi vµo trong mét
tÖp v¨n b¶n. TÖp nµy “®îc lµm cho ch¹y” b»ng c¸ch bËt mét bit thùc hiÖn (qua
chmod +x filename) vµ råi gâ tªn cña tÖp ®ã vµo lêi nh¾c cña vá. Bingo, mét ch-
¬ng tr×nh vá lín. Ch¼ng h¹n, mét b¶n viÕt ®Ó ch¹y chØ lÖnh date theo sau bëi chØ
lÖnh who cã thÓ ®îc t¹o ra vµ thùc hiÖn nh thÕ nµy:
$ echo date > somecript
$ echo who > somecript
$ cat somescript
date
who
$ chmod _x somescript
$ somescript
[output of date followed by who]
$
T¬ng tù nh thÕ, mét ch¬ng tr×nh Perl lµ mét bã c¸c c©u lÖnh vµ ®Þnh nghÜa Perl
®îc nÐm 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 chØ ra r»ng ®©y lµ mét ch¬ng tr×nh Perl vµ
kh«ng ph¶i lµ ch¬ng tr×nh vá, nªn chóng ta cÇn mét bíc phô.
#! /usr/bin/perl
lµm dßng ®Çu tiªn cña tÖp nµy. Nhng nÕu Perl cña b¹n bÞ kÑt vµo mét n¬i
kh«ng chuÈn, hay hÖ ®iÒu hµnh tùa UNIX cña b¹n kh«ng hiÓu dßng #!, th× b¹n cã
thªm viÖc ph¶i lµm. H·y hái ngêi cµi ®Æt Perl vÒ ®iÒu nµy. C¸c thÝ dô trong s¸ch
nµy gi¶ sö r»ng b¹n dïng c¬ chÕ th«ng thêng nµy.
Perl lµ mét ng«n ng÷ phi ®Þnh d¹ng kiÓu nh C - kho¶ng tr¾ng gi÷a c¸c hiÖu bµi
(nh÷ng phÇn tö cña ch¬ng tr×nh, nh print hay +) lµ tuú chän, trõ phi hai hiÖu bµi ®i
víi nhau cã thÓ bÞ lÇm lÉn thµnh mét hiÖu bµi kh¸c, trong trêng hîp ®ã th× kho¶ng
tr¾ng thuéc lo¹i nµo ®ã lµ b¾t buéc. (Kho¶ng tr¾ng bao gåm dÊu c¸ch, dÊu tab,
dßng míi, vÒ ®Çu dßng hay kÐo giÊy.) Cã mét vµi cÊu tróc ®ßi hái mét lo¹i kho¶ng
tr¾ng nµo ®ã ë chç nµo ®ã, nhng chóng sÏ ®îc trá ra khi ta nãi tíi chóng. B¹n cã
thÓ gi¶ thiÕt r»ng lo¹i vµ khèi lîng kho¶ng tr¾ng gi÷a c¸c hiÖu bµi lµ tuú ý trong
c¸c trêng hîp kh¸c.
MÆc dÇu 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, mét c¸ch ®iÓn h×nh ch¬ng tr×nh Perl còng hay ®îc viÕt tôt lÒ nh ch¬ng tr×nh
C, víi nh÷ng phÇn c©u lÖnh lång nhau ®îc viÕt tôt vµo h¬n so víi phÇn bao quanh.
B¹n sÏ thÊy ®Çy nh÷ng thÝ dô chØ ra phong c¸ch viÕt tôt lÒ ®iÓn h×nh trong toµn bé
cuèn s¸ch nµy.
Còng gièng nh b¶n viÕt vÒ vá, 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 chung nh mät tr×nh lín cÇn thùc hiÖn. Kh«ng cã kh¸i
niÖm vÒ tr×nh “chÝnh” main nh trong C.
Chó thÝch cña Perl gièng nh chó thÝch cña líp vá (hiÖn ®¹i). BÊt k× c¸i g× n»m
gi÷a mét dÊu th¨ng (#) tíi cuèi dßng ®Òu lµ mét chó thÝch. Kh«ng cã kh¸i niÖm vÒ
chó thÝch trªn nhiÒu dßng nh C.
Kh«ng gièng hÇu hÕt c¸c líp vá (nhng gièng nh awk vµ sed), bé th«ng dÞch
Perl ph©n tÝch vµ biªn dÞch hoµn toµn ch¬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õ ch¬ng tr×nh mét khi ch¬ng
tr×nh ®· b¾t ®Çu ch¹y, vµ còng cã nghÜa lµ kho¶ng tr¾ng vµ chó thÝch biÕn mÊt vµ
sÏ kh«ng lµm chËm ch¬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 chã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 ®¬n thuÇn
dùa trªn nÒn t¶ng lµ C ®îc biªn dÞch.
ViÖc biªn dÞch nµy kh«ng mÊt thêi gian - sÏ lµ phi hiÖu qu¶ nÕu mét ch¬ng
tr×nh Perl cùc lín l¹i chØ thùc hiÖn mét nhiÖm vô nhá bÐ chãng v¸nh (trong sè
nhiÒu nhiÖm vô tiÒm n¨ng) vµ råi ra, v× thêi gian ch¹y cho ch¬ng tr×nh sÏ nhá xÝu
nÕu so víi thêi gian dÞch.
Cho nªn Perl gièng nh mét bé biªn dÞch vµ th«ng dÞch. Nã lµ biªn dÞch v× ch-
¬ng tr×nh ®îc ®äc vµ ph©n tÝch hoµn toµn tríc khi c©u lÖnh ®Çu tiªn ®îc thùc hiÖn.
Nã lµ bé th«ng dÞch v× kh«ng cã m· ®Ých ngåi ®©u ®ã trót ®Çy kh«ng gian ®Üa.
Theo mét c¸ch nµo ®ã, nã lµ tèt nhÊt cho c¶ hai lo¹i nµy. Ph¶i thó thùc, viÖc Èn ®i
m· ®Ých ®· dÞch gi÷a nh÷ng lêi gäi th× hay, vµ ®ã lµ trong danh s¸ch mong íc cho
Perl t¬ng lai cña Larry.
D¹o qua Perl
Chóng ta b¾t ®Çu cuéc hµnh tr×nh cña m×nh qua Perl b»ng viÖc ®i d¹o mét
chót. ViÖc ®i d¹o nµy sÏ giíi thiÖu mét sè c¸c tÝnh n¨ng kh¸c nhau b»ng c¸ch bæ
sung vµo mét øng dông nhá. Gi¶i thÝch ë ®©y lµ cùc k× ng¾n gän - mçi vïng chñ
®Ò ®Òu ®îc th¶o luËn chi tiÕt h¬n rÊt nhiÒu vÒ sau trong cuèn s¸ch nµy. Nhng cuéc
®i d¹o nhá nµy sÏ cho b¹n kinh nghiÖm nhanh chãng vÒ ng«n ng÷, vµ b¹n cã thÓ
quyÕt ®Þnh liÖu b¹n cã thùc sù muèn kÕt thóc cuèn s¸ch nµy hay ®äc thªm c¸c tin
Usenet hay ch¹y ®i ch¬i trît tuyÕt.
Ch¬ng tr×nh “Xin chµo mäi ngêi”
Ta h·y nh×n vµo mét ch¬ng tr×nh nhá mµ thùc tÕ cã lµm ®iÒu g× ®ã. §©y lµ ch-
¬ng tr×nh “Xin chµo mäi ngêi”:
#!/usr/bin/perl
print “Xin chµo mäi ngêi\n”;
Dßng ®Çu tiªn lµ c©u thÇn chó nãi r»ng ®©y lµ ch¬ng tr×nh Perl. Nã còng lµ lêi
chó thÝch cho Perl - h·y nhí r»ng lêi chó thÝch lµ bÊt k× c¸i g× n»m sau dÊu th¨ng
cho tíi cuèi dßng, gièng nh hÇu hÕt c¸c líp vá hiÖn ®¹i 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
chóng ta thÊy c©u lÖnh print. Tõ kho¸ print b¾t ®Çu ch¬ng tr×nh, vµ nã cã mét ®èi,
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Þ cho kÝ tù dßng
míi; hÖt nh trong C. C©u lÖnh print ®îc kÕt thóc bëi dÊu chÊm phÈy (;). Gièng nh
C, tÊt c¶ c¸c c©u lÖnh ®¬n gi¶n ®Òu kÕt thóc b»ng chÊm phÈy*
.
Khi b¹n gäi ch¬ng tr×nh nµy, phÇn lâi sÏ gäi bé th«ng dÞch Perl, ph©n tÝch c©u
toµn bé ch¬ng tr×nh (hai dßng, kÓ c¶ dßng chó thÝch ®Çu tiªn) vµ råi thùc hiÖn
d¹ng ®· dÞch. Thao t¸c ®Çu tiªn vµ duy nhÊt lµ thùc hiÖn to¸n tö print, ®iÒu nµy göi
*
DÊu chÊm phÈy cã thÓ bá ®i khi c©u lÖnh nµy lµ c©u lÖnh cuèi cña mét khèi hay tÖp hay eval.
®èi cña nã ra lèi ra. Sau khi ch¬ng tr×nh ®· hoµn tÊt, th× tiÕn tr×nh Perl ra, cho l¹i
mét m· ra thµnh c«ng cho líp vá.
Hái c©u hái vµ nhí kÕt qu¶
Ta h·y thªm mét chót phøc t¹p h¬n. Tõ Xin chµo mäi ngêi lµ mét sù ®ông
ch¹m l¹nh nh¹t vµ cøng r¾n. Ta h·y lµm cho ch¬ng tr×nh gäi b¹n theo tªn b¹n. §Ó
lµm viÖc nµy, ta cÇn mét chç gi÷ tªn, mét c¸ch hái tªn, vµ mét c¸ch nhËn c©u tr¶
lêi.
Mét lo¹i ®Æt chç gi÷ gi¸ trÞ (tùa nh mét tªn) lµ biÕn v« híng. Víi ch¬ng tr×nh
nµy, ta sÏ dïng biÕn v« híng $name ®Ó gi÷ tªn b¹n. Chóng ta sÏ ®i chi tiÕt h¬n
trong Ch¬ng 2, D÷ liÖu v« híng, vÒ nh÷ng g× mµ biÕn nµy cã thÓ gi÷, vµ nh÷ng g×
b¹n cã thÓ lµm víi chóng. HiÖn t¹i, gi¶ sö r»ng b¹n cã thÓ gi÷ mét sè hay 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¸ch nh¾c vµ mét
c¸ch nhËn c¸i vµo. Ch¬ng tr×nh tríc ®· chØ ra cho ta c¸ch nh¾c - dïng to¸n tö print.
Vµ c¸ch ®Ó nhËn mét dßng tõ thiÕt bÞ cuèi lµ víi to¸n tö <STDIN>, mµ (nh ta sÏ
dïng nã ë ®©y) lÊy mét dßng c¸i vµo. Ta g¸n c¸i vµo nµy cho biÕn $name. §iÒu
nµy cho ta ch¬ng tr×nh:
print “Tªn b¹n lµ g×? : ”;
$name = <STDIN> ;
Gi¸ trÞ cña $name t¹i ®iÓm nµy cã mét dÊu dßng míi kÕt thóc (Randal cã trong
Randal\n). §Ó vøt bá ®iÒu ®ã, chóng ta dïng to¸n tö chop(), to¸n tö lÊy mét biÕn v«
híng lµm ®èi duy nhÊt vµ bá ®i kÝ tù cuèi tõ gi¸ trÞ x©u cña biÕn:
chop($name);
B©y giê tÊt c¶ nh÷ng g× ta cÇn lµm lµ nãi Xin chµo, tiÕp ®ã lµ gi¸ trÞ cña biÕn
$name, mµ ta cã thÓ thùc hiÖn theo kiÓu vá b»ng c¸ch nhóng biÕn nµy vµo bªn
trong x©u cã ngoÆc kÐp:
print “Xin chµo, $name!\n”;
Gièng nh líp vá, nÕu ta muèn mét dÊu ®« la thay v× tham kh¶o biÕn v« híng,
th× ta cã thÓ ®Æt tríc dÊu ®« la víi mét dÊu sæ chÐo ngîc.
G¾n tÊt c¶ l¹i, ta ®îc:
#!/usr/bin/perl
print “Tªn b¹n lµ g×? ”;
$name = <STDIN> ;
chop($name);
print “Xin chµo, $name!\n”;
Bæ sung chän lùa
B©y giê ta muèn cã mét lêi chµo ®Æc biÖt cho Randal, nhng muèn lêi chµo
th«ng thêng cho 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 Randal, vµ nÕu hai x©u lµ mét, th× lµm ®iÒu g× ®ã ®Æc biÖt. Ta h·y bæ sung
thªm lÖnh rÏ nh¸nh if-then-else vµ phÐp so s¸nh vµo ch¬ng tr×nh:
#!/usr/bin/perl
print “Tªn b¹n lµ g×? ”;
$name = <STDIN> ;
chop($name);
if ($name eq “Randal”) {
print “Xin chµo Randal! Tèt qu¸ anh l¹i ë ®©y!\n”;
} else {
print “Xin chµo, $name!\n”; # chµo mõng th«ng thêng
}
To¸n tö eq so s¸nh hai x©u. NÕu chóng b»ng nhau (tõng kÝ tù mét, vµ cã cïng
chiÒu dµi), th× kÕt qu¶ lµ ®óng. (Kh«ng cã to¸n tö nµy trong C, vµ awk ph¶i dïng
cïng to¸n tö cho x©u vµ sè vµ t¹o ra viÖc ®o¸n cã rÌn luyÖn.)
C©u lÖnh if chän xem khèi c©u lÖnh nµo (gi÷a c¸c dÊu ngoÆc nhän s¸nh ®óng)
lµ ®îc thùc hiÖn - nÕu biÓu thøc lµ ®óng, ®ã lµ khèi thø nhÊt, nÕu kh«ng th× ®ã lµ
khèi thø hai.
§o¸n tõ bÝ mËt
Nµo, v× chóng ta ®· cã mét tªn nªn ta h·y ®Ó cho mét ngêi ch¹y ch¬ng tr×nh
®o¸n mét tõ bÝ mËt. Víi mäi ngêi ngo¹i trõ Randal, chóng ta sÏ ®Ó cho ch¬ng tr×nh
cø hái lÆp l¹i ®Ó ®o¸n cho ®Õn khi nµo ngêi nµy ®o¸n ®îc ®óng. Tríc hÕt ta h·y
xem ch¬ng tr×nh nµy vµ råi xem gi¶i thÝch:
#! /usr/bin/perl
$secretword = “llama”; # tõ bÝ mËt
print “Tªn b¹n lµ g×?” ;
$name = <STDIN> ;
chop($name);
if ($name eq “Randal”) {
print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;
} else {
print “Xin chµo, $name!\n ; # chµo th«ng th ” êng
print “Tõ bÝ mËt lµ g×?” ;
$guess = <STDIN>;
chop($guess);
while ($guess ne $secrectword) {
print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;
$guess = <STDIN>;
chop($guess);
}
}
Tríc hÕt, ta ®Þnh nghÜa tõ bÝ mËt b»ng viÖc ®Æt nã vµo trong biÕn v« híng kh¸c,
$secretword. Sau khi ®ãn chµo, mét ngêi (kh«ng ph¶i Randal) sÏ ®îc yªu cÇu (víi
mét c©u lÖnh print kh¸c) ®o¸n ch÷. Lêi ®o¸n råi ®îc ®em ra so s¸nh víi tõ bÝ mËt
b»ng viÖc dïng to¸n tö ne, mµ sÏ cho l¹i ®óng nÕu c¸c x©u nµy kh«ng b»ng nhau
(®©y lµ to¸n tö logic ngîc víi to¸n tö eq). KÕt qu¶ cña viÖc so s¸nh sÏ kiÓm so¸t
cho tr×nh while, chu tr×nh nµy thùc hiÖn khèi th©n cho tíi khi viÖc so s¸nh vÉn cßn
®óng.
TÊt nhiªn, ch¬ng tr×nh nµy kh«ng ph¶i lµ an toµn l¾m, v× bÊt k× ai mÖt víi viÖc
®o¸n còng ®Òu cã thÓ ®¬n thuÇn ng¾t ch¬ng tr×nh vµ quay trë vÒ lêi nh¾c, hay thËm
chÝ cßn nh×n qua ch¬ng tr×nh gèc ®Ó x¸c ®Þnh ra tõ. Nhng, chóng ta hiÖn t¹i cha
®Þnh viÕt mét hÖ thèng an toµn, chØ xem nh mét thÝ dô cho trang hiÖn t¹i cña cuèn
s¸ch nµy.
NhiÒu tõ bÝ mËt
Ta h·y xem c¸ch thøc m×nh cã thÓ söa ®æi ®o¹n ch¬ng tr×nh nµy ®Ó cho phÐp
cã nhiÒu tõ bÝ mËt. B»ng viÖc dïng ®iÒu ta ®· thÊy, chóng ta cã thÓ so s¸nh lêi
®o¸n lÆp ®i lÆp l¹i theo mét chuçi c©u tr¶ lêi râ ®îc cÊt gi÷ trong c¸c biÕn v« híng
t¸ch 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 m¸y tÝnh trªn c¬ së ngµy lµm viÖc thêng lÖ.
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¸ch hay m¶ng. Mçi phÇn tö cña m¶ng ®Òu lµ mét biÕn v«
híng t¸ch biÖt mµ cã thÓ ®îc ®Æt gi¸ trÞ hay th©m nhËp ®éc lËp. Toµn bé m¶ng
còng cã thÓ ®îc trao cho mét gi¸ trÞ trong mét có ®ét nhËp. Ta cã thÓ g¸n mét gi¸
trÞ cho toµn bé m¶ng cã tªn @words sao cho nã chøa ba mËt hiÖu tèt cã thÓ cã:
@words = (“camel”, “llama”, “oyster”);
Tªn biÕn m¶ng b¾t ®Çu víi @, cho nªn chó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Ó th©m nhËp vµo tõng phÇn tö b»ng viÖc
dïng mét tham kh¶o chØ sè. Cho nªn $words[0] lµ camel, $words[1] lµ llama,
$words[2] lµ oyster. ChØ cè còng cã thÓ lµ mét biÓu thøc, cho nªn nÕu ta ®Æt $i lµ 2
th× $words[$i] lµ oyster. (Tham kh¶o chØ sè b¾t ®Çu víi $ thay v× @ v× chó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
$words = (“camel”, “llama”, “oyster”); # tõ bÝ mËt
print “Tªn b¹n lµ g×?” ;
$name = <STDIN> ;
chop($name);
if ($name eq “Randal”) {
print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;
} else {
print “Xin chµo, $name!\n”; # chµo th«ng thêng
print “Tõ bÝ mËt lµ g×?” ;
$guess = <STDIN>;
chop($guess);
$i = 0; # thö tõ nµy tríc hÕt
$correct = “ cã thÓ”; # tõ ®o¸n cã ®óng hay kh«ng?
while ($correct eq $guess) { # cø kiÓm tra ®Õn khi biÕt
if ($words[$i] eq $guess) { # ®óng kh«ng
$correct = “cã”; # cã
} elsif ($i < 2) { # cÇn ph¶i xÐt thªm tõ n÷a?
$i = $i + 1; # nh×n vµo tõ tiÕp lÇn sau
} else # hÕt råi, thÕ lµ háng
print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;
$guess = <STDIN>;
chop($guess);
$i = 0; # b¾t ®Çu kiÓm tra tõ ®Çu lÇn n÷a
}
} # kÕt thóc cña while not correct
} # kÕt thóc cña not Randal “ ”
B¹n sÏ ®Ó ý r»ng chóng ta ®ang dïng biÕn v« híng $correct ®Ó chØ ra r»ng
chóng ta vÉn ®ang t×m ra mËt hiÖu ®óng, hay r»ng chóng ta kh«ng t×m thÊy.
Ch¬ng tr×nh nµy còng chØ ra khèi elsif cña c©u lÖnh if-then-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 khèi else cïng víi
mét ®iÒu kiÖn if míi, nhng kh«ng lång bªn trong cÆp dÊu ngoÆc nhän 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 mét d©y chuyÒn
ph©n tÇng if-elsif-elsif-elsif-else.
Cho mçi ngêi mét tõ bÝ mËt kh¸c nhau
Trong ch¬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 s¸nh gi÷a ngêi vµ tõ:
Ngêi Tõ bÝ mËt
Fred
Barney
Betty
Wilma
Camel
Llama
Oyster
Oyster
Chó ý r»ng c¶ Betty vµ Wilma ®Òu cã cïng tõ bÝ mËt. §iÒu nµy lµ ®îc.
C¸ch dÔ nhÊt ®Ó cÊt gi÷ mét b¶ng nh thÕ trong Perl lµ b»ng mét m¶ng kÕt hîp.
Mçi phÇn tö cña m¶ng nµy gi÷ mét gi¸ trÞ v« híng t¸ch biÖt (hÖt nh kiÓu m¶ng
kh¸c), nhng c¸c m¶ng l¹i ®îc tham kh¶o tíi theo kho¸, mµ 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 kÕt hîp ®îc gäi lµ %words (chó ý % chø kh«ng ph¶i lµ @) víi kho¸ vµ