Siêu thị PDFTải ngay đi em, trời tối mất

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
MIỄN PHÍ
Số trang
139
Kích thước
662.3 KB
Định dạng
PDF
Lượt xem
801

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×?

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µ

Tải ngay đi em, còn do dự, trời tối mất!