203
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

€¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Lêi giíi thiÖu

Cuèn s¸ch nµy nãi vÒ g×

1: Giíi thiÖuLÞch sö cña PerlMôc ®Ých cña PerlNh÷ng ®iÒu cã s½nHç trîC¸c kh¸i niÖm c¬ b¶nD¹o qua PerlBµi tËp

2:D÷ liÖu v« híngD÷ liÖu v« híng lµ g×?SèX©uTo¸n töBiÕn v« híngTo¸n tö trªn biÕn v« híng<STDIN> nh gi¸ trÞ v« híng§a ra víi print()Gi¸ trÞ undefBµi tËp

3: D÷ liÖu m¶ng vµ danh s¸chM¶ng lµ g×?BiÓu diÔn h»ng kÝ hiÖuBiÕnTo¸n töV« híng vµ ng÷ c¶nh m¶ng<STDIN> nh mét m¶ngNéi suy biÕn thiªn cña m¶ngBµi tËp

4: CÊu tróc ®iÒu khiÓnKhèi c©u lÖnhC©u lÖnh if/unlessC©u lÖnh while/untilC©u lÖnh forC©u lÖnh foreachBµi tËp

5: M¶ng kÕt hîp

Page 2: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

M¶ng kÕt hîp lµ g×?BiÕn m¶ng kÕt hîpBiÓu diÔn h»ng kÝ hiÖu cho m¶ng kÕt hîpTo¸n tö m¶ng kÕt hîpBµ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 STDOUTBµi tËp

7: BiÓu thøc chÝnh quiKh¸i niÖm vÒ biÓu thøc chÝnh quiC¸ch dïng ®¬n gi¶n vÒ biÓu thøc chÝnh quiMÉuNãi thªm vÒ to¸n tö ®èi s¸nhPhÐp thÕC¸c to¸n tö split(0 vµ join()Bµi tËp

8: HµmC¸c hµm hÖ thèng vµ ngêi dïng§Þnh nghÜa hµm ngêi dïngGäi hµm ngêi dïngCho l¹i gi¸ trÞ§èiBiÕn côc bé trong hµmBµi tËp

9: C¸c cÊu tróc ®iÒu khiÓn To¸n tö lastTo¸n tö nextTo¸n tö redoKhèi cã nh·nBé söa ®æi biÓu thøc&&, || vµ ?: xem nh c¸c cÊu tróc ®iÒu khiÓnBµi tËp

10: Gi¶i quyÕt tÖp vµ kiÓm thö tÖpTíc hiÖu tÖp lµ g×?Më vµ ®ãng mét tíc hiÖu tÖpMét chót tiªu khiÓn: die()Dïng tíc hiÖu tÖp

Page 3: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

KiÓm tra tÖp -xTo¸n tö stat() vµ lstat()Dïng _FilehandleBµi tËp

11: §Þnh d¹ng§Þnh d¹ng lµ g×?X¸c ®Þnh mét ®Þnh d¹ngGäi mét ®Þnh d¹ngNãi thªm vÒ Fieldholder§Þnh d¹ng ®Ønh trang§æi gi¸ trÞ mÆc ®Þnh cho ®Þnh d¹ngBµi tËp

12: Th©m nhËp danh môc§i vßng quanh c©y danh môcGlobbingGi¶i quyÕt danh môcMë vµ ®ãng bé gi¶i quyÕt danh môc§äc bé gi¶i quyÕt danh môcBµi tËp

13: Thao t¸c tÖp vµ danh môcLo¹i bá tÖp§æi tªn tÖpT¹o ra tªn thay phiªn cho mét tÖp (liªn kÕt)T¹o ra vµ xo¸ danh môcSöa ®æi phÐp dïngSöa ®æi quyÒn dïngSöa ®æi thêi h¹nBµi tËp

14: Qu¶n lÝ tiÕn tr×nhDïng system() vµ exec()Dïng BackquotesDïng Proceses vµ FilehandlesDïng folkTãm t¾t vÒ c¸c phÐp to¸n tiÕn tr×nhGöi vµ nhËn tÝn hiÖuBµi tËp

15: BiÕn ®æi d÷ liÖu kh¸cT×m x©u conTrÝch vµ thay thÕ x©u con

Page 4: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

§Þnh d¹ng d÷ liÖu b»ng sprintf()S¾p xÕp cao cÊpChuyÓ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©nLÊy th«ng tin m¹ngLÊy th«ng tin kh¸cBµi tËp

17: Thao t¸c c¬ së d÷ liÖu ngêi dïngC¬ së d÷ liÖu DBM vµ m¶ng DBMMë vµ ®ãng m¶ng DBMDïng m¶ng DBMC¬ së d÷ liÖu th©m nhËp ngÉu nhiªn chiÒu dµi cè ®ÞnhC¬ 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 PerlChuyÓn Ch¬ng tr×nh awk sang PerlChuyÓn Ch¬ng tr×nh sed sang PerlBµi tËp

A: Tr¶ lêi bµi tËp

B: C¬ së vÒ nèi m¹ngM« h×nh chç c¾mKh¸ch mÉuBé phôc vô mÉu

C: Nh÷ng chñ ®Ò cha ®Ò cËp tíiBé gì lçiDßng lÖnhC¸c to¸n tö kh¸cNhiÒu, nhiÒu hµm n÷aNhiÒu, nhiÒu biÕn ®Æt s½n n÷aX©u ë ®©yreturn (tõ ch¬ng tr×nh con)To¸n tö eval (vµ s///e)Thao t¸c b¶ng kÝ hiÖu víi *FREDTo¸n tö gotoTo¸n tö require

Page 5: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Th viÖnPerl b¶n 5.0 GoodiesChØ môc

Page 6: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

1

Giíi thiÖu

LÞch sö PerlPerl 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

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

Page 7: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

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 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 ®îcPerl: not found

Page 8: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

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.

Page 9: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Ý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

Page 10: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$ cat somescriptdatewho$ 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/perllµ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

Page 11: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

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/perlprint “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

Page 12: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

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 ®è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:* 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.

Page 13: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

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/perlprint “Tªn b¹n lµ g×? ”;$name = <STDIN> ;chop($name);print “Xin chµo, $name!\n”;

Bæ sung chän lùaB©y giê ta muèn cã mét lêi chµo ®Æc biÖt cho Randal, nh-

ng 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/perlprint “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.

Page 14: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

§o¸n tõ bÝ mËtNµ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Ëtprint “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êngprint “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

Page 15: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

®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Ëtprint “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êngprint “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?

Page 16: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$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ËtFredBarneyBettyWilma

CamelLlamaOysterOyster

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ó ý %

Page 17: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

chø kh«ng ph¶i lµ @) víi kho¸ vµ gi¸ trÞ ®îc cho trong b¶ng trªn, ta g¸n mét gi¸ trÞ cho %words (nh ta ®· lµm nhiÒu tríc ®©y víi m¶ng kh¸c):

%words = (“fred”, “camel”, “barney”, “llama”, “betty”, “oyster”, “wilma”, “oyster”) ;

Mçi cÆp gi¸ trÞ trong danh s¸ch ®Òu biÓu thÞ cho mét kho¸ vµ gi¸ trÞ t¬ng øng cña nã trong m¶ng kÕt hîp. Chó ý r»ng ta ®· bÎ phÐp g¸n nµy ra hai dßng mµ kh«ng cã bÊt k× lo¹i kÝ tù nèi dßng nµo, v× kho¶ng tr¾ng nãi chung lµ v« nghÜa trong ch¬ng tr×nh Perl.

§Ó t×m ra tõ bÝ mËt cho Betty, ta cÇn dïng Betty nh kho¸ trong mét tham kh¶o vµo m¶ng kÕt hîp %words, qua mét biÓu thøc nµo ®ã nh %words{“betty”}. Gi¸ trÞ cña tham kh¶o nµy lµ oyster, t¬ng tù nh ®iÒu ta ®· lµm tríc ®©y víi m¶ng kh¸c. Còng nh tríc ®©y, kho¸ cã thÓ lµ bÊt k× biÓu thøc nµo, cho nªn ®Æt $person víi betty vµ tÝnh $words{$person} còng cho oyster.

G¾n tÊt c¶ nh÷ng ®iÒu nµy l¹i ta ®îc ch¬ng tr×nh nh thÕ nµy:

#! /usr/bin/perl%words = (“fred”, “camel”, “barney”, “llama”,

“betty”, “oyster”, “wilma”, “oyster”) ;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$secretword = $words{$name}; # lÊy tõ bÝ mËtprint “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ($correct ne $secretwords) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} # kÕt thóc cña while } # kÕt thóc cña “not Randal”B¹n h·y chó ý nh×n vµo tõ bÝ mËt. NÕu kh«ng t×m thÊy tõ

Page 18: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

nµy th× gi¸ trÞ cña $secretword sÏ lµ mét x©u rçng*, mµ ta cã thÓ kiÓm tra liÖu ta cã muèn x¸c ®Þnh mét tõ bÝ mËt mÆc ®Þnh cho ai ®ã kh¸c kh«ng. §©y lµ c¸ch xem nã:

[... phÇn cßn l¹i cña ch¬ng tr×nh ®· bÞ xo¸...]$secretword = $words{$name}; # lÊy tõ bÝ mËtif ($secretword eq “”) { # Êy, kh«ng thÊy

$secretword = “®å c¸u kØnh”; # ch¾c ch¾n, sao kh«ng lµ vÞt?

}print “Tõ bÝ mËt lµ g×?” ;

[... phÇn cßn l¹i cña ch¬ng tr×nh ®· bÞ xo¸...]

Gi¶i quyÕt ®Þnh d¹ng c¸i vµo thay ®æiNÕu t«i ®a vµo Randal L. Schwartz hay randal thay v×

Randal th× t«i sÏ bÞ ®ãng côc l¹i víi phÇn ngêi dïng cßn l¹i, v× viÖc so s¸nh eq th× l¹i so s¸nh ®óng sù b»ng nhau. Ta h·y xem mét c¸ch gi¶i quyÕt cho ®iÒu ®ã.

Gi¶ sö t«i muèn t×m bÊt k× x©u nµo b¾t ®Çu víi Randal, thay v× chØ lµ mét x©u b»ng Randal. T«i cã thÓ lµm ®iÒu nµy trong sed hay awk hoÆc grep víi mét biÓu thøc chÝnh qui: mét tiªu b¶n sÏ x¸c ®Þnh ra mét tËp hîp c¸c x©u s¸nh ®óng. Gièng nh trong sed hay grep, biÓu thøc chÝnh qui trong Perl ®Ó s¸nh bÊt k× x©u nµo b¾t ®Çu víi Randal lµ ^Randal. §Ó s¸nh x©u nµy víi x©u trong $name, chóng ta dïng to¸n tö s¸nh nh sau:

if ($name =~ /^Randal/) {## cã, s¸nh ®óng

} else {## kh«ng, s¸nh sai

}Chó ý r»ng biÓu thøc chÝnh qui ®îc ®Þnh biªn bëi dÊu sæ

chÐo. Bªn trong c¸c dÊu sæ chÐo, dÊu c¸ch vµ kho¶ng tr¾ng lµ cã nghÜa, hÖt nh chóng ë bªn trong x©u.

§iÒu nµy gÇn nh thÕ, nhng nã l¹i kh«ng gi¶i quyÕt viÖc lùa ra randal hay lo¹i bá Randall. §Ó chÊp nhËn randal, chóng ta thªm tuú chän bá qua hoa thêng, mét ch÷ i nhá ®îc thªm vµo sau dÊu sæ chÐo ®ãng. §Ó lo¹i bá Randall, ta thªm mét ®¸nh dÊu ®Æc biÖt ®Þnh biªn tõ (t¬ng tù víi vi vµ mét sè b¶n cña grep) díi d¹ng cña \b trong biÓu thøc chÝnh qui. §iÒu nµy ®¶m b¶o r»ng kÝ tù ®i sau l ®Çu tiªn trong biÓu thøc chÝnh qui kh«ng ph¶i lµ mét kÝ tù kh¸c. §iÒu nµy lµm thay ®æi biÓu thøc * §îc, ®Êy chÝnh lµ gi¸ trÞ undef, nhng nã tr«ng nh mét x©u rçng cho to¸n tö eq

Page 19: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

chÝnh qui thµnh /^randal\b/i, mµ cã nghÜa lµ “randal t¹i ®Çu x©u, kh«ng cã kÝ tù hay ch÷ sè nµo theo sau, vµ chÊp nhËn c¶ hai kiÓu ch÷ hoa thêng.”

Khi g¾n tÊt c¶ l¹i víi phÇn cßn l¹i cña ch¬ng tr×nh th× nã sÏ gièng nh thÕ nµy:

#! /usr/bin/perl%words = (“fred”, “camel”, “barney”, “llama”,

“betty”, “oyster”, “wilma”, “oyster”) ;print “Tªn b¹n lµ g×?” ;$name = <STDIN> ;chop($name);if ($name =~ /^randal\b/i ) {

print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;} else {

print “Xin chµo, $name!\n”; # chµo th«ng thêng$secretword = $words{$name}; # lÊy tõ bÝ mËtif ($secretword eq “”) { # Êy, kh«ng thÊy $secretword = “®å c¸u kØnh”; # ch¾c ch¾n, sao

kh«ng lµ vÞt?}print “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ($correct ne $secretwords) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} # kÕt thóc cña while } # kÕt thóc cña “not Randal”Nh b¹n cã thÓ thÊy, ch¬ng tr×nh nµy kh¸c xa víi ch¬ng

tr×nh ®¬n gi¶n Xin chµo, mäi ngêi, nhng nã vÉn cßn rÊt nhá bÐ vµ lµm viÖc ®îc, vµ nã qu¶ lµm ®îc tÝ chót víi c¸i ng¾n xÝu vËy. ®©y chÝnh lµ c¸ch thøc cña Perl.

Perl ®a ra tÝnh n¨ng vÒ c¸c biÓu thøc chÝnh qui cã trong mäi tr×nh tiÖn Ých UNIX chuÈn (vµ thËm chÝ trong mét sè kh«ng chuÈn). Kh«ng chØ cã thÕ, nhng c¸ch thøc Perl gi¶i quyÕt cho viÖc ®èi s¸nh x©u lµ c¸ch nhanh nhÊt trªn hµnh tin nµy, cho nªn b¹n kh«ng bÞ mÊt hiÖu n¨ng. (Mét ch¬ng tr×nh gièng nh grep ®îc viÕt trong Perl thêng ®¸nh b¹i ch¬ng tr×nh grep ®îc c¸c nhµ cung cÊp viÕt trong C víi hÇu hÕt c¸c c¸i vµo. §iÒu nµy cã nghÜa lµ thËm chÝ grep kh«ng thùc hiÖn mét viÖc cña nã thËt tèt.)

Page 20: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Lµm cho c«ng b»ng víi mäi ngêiVËy b©y giê t«i cã thÓ ®a vµo Randal hay randal hay

Randal L. Schwartz, nhng víi nh÷ng ngêi kh¸c th× sao? Barney vÉn ph¶i nãi ®óng barney (thËm chÝ kh«ng ®îc cã barney víi mét dÊu c¸ch theo sau).

§Ó c«ng b»ng cho Barey, chóng ta cÇn n¾m ®îc tõ ®Çu cña bÊt k× c¸i g× ®îc ®a vµo, vµ råi chuyÓn nã thµnh ch÷ thêng tríc khi ta tra tªn trong b¶ng. Ta lµm ®iÒu nµy b»ng hai to¸n tö: to¸n tö substitute, t×m ra mét biÓu thøc chÝnh qui vµ thay thÕ nã b»ng mét x©u, vµ to¸n tö translate, ®Ó ®Æt x©u nµy thµnh ch÷ thêng.

Tríc hÕt, to¸n tö thay thÕ: chóng ta muèn lÊy néi dung cña $name, t×m kÝ tù ®Çu tiªn kh«ng lµ tõ, vµ lo¹i ®i mäi thø tõ ®©y cho ®Õn cuèi x©u. /\W.*/ lµ mét biÓu thøc chÝnh qui mµ ta ®ang t×m kiÕm - \W viÕt t¾t cho kÝ tù kh«ng ph¶i lµ tõ (mét c¸i g× ®ã kh«ng ph¶i lµ ch÷, ch÷ sè hay g¹ch thÊp) vµ .* cã nghÜa lµ bÊt k× kÝ tù nµo tõ ®Êy tíi cuèi dßng. B©y giê, ®Ó lo¹i nh÷ng kÝ tù nµy ®i, ta cÇn lÊy bÊt k× bé phËn nµo cña x©u s¸nh ®óng víi biÓu thøc chÝnh qui nµy vµ thay nã víi c¸i kh«ng cã g×:

$name =~ s/\W.*//;Chóng ta ®ang dïng cïng to¸n tö =~ mµ ta ®· dïng tríc ®ã,

nhng b©y giê bªn vÕ ph¶i ta cã to¸n tö thay thÕ: ch÷ s ®îc theo sau bëi mét biÓu thøc chÝnh qui vµ x©u ®îc ®Þnh biªn bëi dÊu sæ chÐo. (X©u trong thÝ dô nµy lµ x©u rçng gi÷a dÊu sæ chÐo thø hai vµ thø ba.) To¸n tö nµy tr«ng gièng vµ hµnh ®éng rÊt gièng nh phÐp thay thÕ cña c¸c tr×nh so¹n th¶o kh¸c nhau.

B©y giê ®Ó cã ®îc bÊt k× c¸i g× cßn l¹i trë thµnh ch÷ th-êng th× ta ph¶i dÞch x©u nµy dïng to¸n tö tr. Nã tr«ng rÊt gièng chØ lÖnh tr cña UNIX, nhËn mét danh s¸ch c¸c kÝ tù ®Ó t×m vµ mét danh s¸ch c¸c kÝ tù ®Ó thay thÕ chóng. Víi thÝ dô cña ta, ®Ó ®Æt néi dung cña $name thµnh ch÷ thêng, ta dïng:

$name =~ tr/A-Z/a-z/;C¸c dÊu sæ chÐo ph©n t¸ch c¸c danh s¸ch kÝ tù cÇn t×m vµ

cÇn thay thÕ. DÊu g¹ch ngang gi÷a A vµ Z thay thÕ cho tÊt c¶ c¸c kÝ tù n»m gi÷a, cho nªn chóng ta cã hai danh s¸ch, mçi danh s¸ch cã 26 kÝ tù. Khi to¸n tö tr t×m thÊy mét kÝ tù tõ mét x©u trong danh s¸ch thø nhÊt th× kÝ tù ®ã sÏ ®îc thay thÕ b»ng kÝ tù t¬ng øng trong danh s¸ch thø hai. Cho nªn tÊt c¶ c¸c

Page 21: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

ch÷ hoa A trë thµnh ch÷ thêng a, vµ cø nh thÕ* .G¾n tÊt c¶ l¹i víi mäi thø kh¸c sÏ cho kÕt qu¶ trong:#! /usr/bin/perl%words = (“fred”, “camel”, “barney”, “llama”,

“betty”, “oyster”, “wilma”, “oyster”) ;print “Tªn b¹n lµ g×?” ;$name = <STDIN> ;chop($name);$original_name = $name; # cÊt gi÷ ®Ó chµo mõng$name =~ s/\W.*//; # bá mäi thø sau tõ ®Çu$name =~ tr/A-Z/a-z/; # mäi thø thµnh ch÷ thêngif ($name eq “randal” ) {

print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;} else {

print “Xin chµo, $original_name!\n”; # chµo th«ng th-êng

$secretword = $words{$name}; # lÊy tõ bÝ mËtif ($secretword eq “”) { # Êy, kh«ng thÊy $secretword = “®å c¸u kØnh”; # ch¾c ch¾n, sao

kh«ng lµ vÞt?}print “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ($correct ne $secretwords) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} # kÕt thóc cña while } # kÕt thóc cña “not Randal”B¹n h·y ®Ó ý ®Õn c¸ch thøc biÓu thøc chÝnh qui s¸nh ®óng

víi tªn t«i Randal ®· l¹i trë thµnh viÖc so s¸nh ®¬n gi¶n. Sau rèt, c¶ Randal L. Schwartz vµ Randal ®Òu trë thµnh randal sau khi viÖc thay thÕ vµ dÞch. Vµ mäi ngêi kh¸c còng cã ®îc sù c«ng b»ng, v× Fred vµ Fred Flinstone c¶ hai ®Òu trë thµnh fred, Barney Rubble vµ Barney, the little guy sÏ trë thµnh barney, v©n v©n.

Víi chØ vµi c©u lÖnh, chóng ta ®· t¹o ra mét ch¬ng tr×nh th©n thiÖn ngêi dïng h¬n nhiÒu. B¹n sÏ thÊy r»ng viÖc diÔn t¶ * C¸c chuyªn gia sÏ lu ý r»ng t«i còng ®· x©y dùng mét c¸i g× ®ã tùa nh s/(\S*).*/\L$1/ ®Ó lµm tÊt c¶ ®iÒu nµy trong mét có ®ét kÝch, nhng c¸c chuyªn gia cã lÏ sÏ kh«ng ®äc môc nµy.

Page 22: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

thao t¸c x©u phøc t¹p víi vµi nÐt lµ mét trong nhiÒu ®iÓm m¹nh cña Perl.

Tuy nhiªn, chÐm vµo tªn ®Ó cho ta cã thÓ so s¸nh nã vµ tra cøu nã trong b¶ng th× sÏ ph¸ huû mÊt tªn ta võa ®a vµo. Cho nªn, tríc khi chÐm vµo tªn, cÇn ph¶i cÊt gi÷ nã vµo trong @original_name. (Gièng nh c¸c kÝ hiÖu C, biÕn Perl bao gåm c¸c ch÷, ch÷ sè vµ dÊu g¹ch thÊp vµ cã thÓ cã chiÒu dµi gÇn nh kh«ng giíi h¹n.) VËy ta cã thÓ lµm tham kh¶o tíi $original_name vÒ sau.

Perl cã nhiÒu c¸ch ®Ó gi¸m s¸t vµ chÆt c¾t x©u. b¹n sÏ thÊy phÇn lín chóng trong Ch¬ng 7, BiÓu thøc chÝnh qui vµ Ch-¬ng 15, ViÖc chuyÓn ®æi d÷ liÖu kh¸c.Lµm cho nã m« ®un h¬n mét chót

Bëi v× chóng ta ®· thªm qu¸ nhiÒu m· nªn ta ph¶i duyÖt qua nhiÒu dßng chi tiÕt tríc khi ta cã thÓ thu ®îc toµn bé luång ch-¬ng tr×nh. §iÒu ta cÇn lµ t¸ch b¹ch logic møc cao (hái tªn, chu tr×nh dùa trªn tõ bÝ mËt ®a vµo) víi c¸c chi tiÕt (so s¸nh mét tõ bÝ mËt víi tõ ®· biÕt). Chóng ta cã thÓ lµm ®iÒu nµy cho râ rµng, hoÆc cã thÓ bëi v× mét ngêi ®ang viÕt phÇn cao cÊp cßn ngêi kh¸c th× viÕt (hay ®· viÕt) phÇn chi tiÕt.

Perl cung cÊp c¸c ch¬ng tr×nh con cã tham biÕn vµ gi¸ trÞ cho l¹i. Mét ch¬ng tr×nh con ®îc x¸c ®Þnh mét khi nµo ®ã trong ch¬ng tr×nh, vµ råi cã thÓ ®îc dïng lÆp ®i lÆp l¹i b»ng viÖc gäi tõ bªn trong bÊt k× biÓu thøc nµo.

Víi ch¬ng tr×nh nhá nhng t¨ng trëng nhanh cña chóng ta, ta h·y t¹o ra mét ch¬ng tr×nh con tªn lµ &good_word (tÊt c¶ c¸c tªn ch¬ng tr×nh con ®Òu b¾t ®Çu víi mét dÊu vµ &) mµ nhËn mét tªn ®· s¹ch vµ mét tõ ®o¸n, råi cho l¹i true nÕu tõ ®ã lµ ®óng, vµ cho l¹i false nÕu kh«ng ®óng. ViÖc x¸c ®Þnh ch¬ng tr×nh con ®ã tùa nh thÕ nµy:

sub good_word {local($somename, $someguess) = @_; # tªn tham biÕn$somename =~ s/\W.*//; # bá mäi thø sau tõ ®Çu$somename =~ tr/A-Z/a-z/; # mäi thø thµnh ch÷ thêngif ($somename eq “randal”) { # kh«ng nªn ®o¸n

1; #gi¸ trÞ cho l¹i lµ true} elsif (($words{$somename} || “®å c¸u kØnh”) eq

$someguess) {1; # gi¸ trÞ cho l¹i lµ true

} else {0; # cho l¹i gi¸ trÞ false

Page 23: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}}Tríc hÕt, viÖc ®Þnh nghÜa ra mét ch¬ng tr×nh con bao

gåm mét tõ dµnh riªng sub ®i theo sau lµ tªn ch¬ng tr×nh con (kh«ng cã dÊu vµ &) tiÕp n÷a lµ mét khèi m· lÖnh (®îc ®Þnh biªn bëi dÊu ngoÆc nhän). §Þnh nghÜa nµy cã thÓ ®Ó vµo bÊt k× ®©u trong tÖp ch¬ng tr×nh, nhng phÇn lín mäi ngêi thÝch ®Ó chóng vµo cuèi.

Dßng ®Çu tiªn trong ®Þnh nghÜa ®Æc biÖt nµy lµ mét phÐp g¸n lµm viÖc sao c¸c gi¸ trÞ cña hai tham biÕn cña ch¬ng tr×nh nµy vµo hai biÕn côc bé cã tªn $somename vµ $someguess. (local() x¸c ®Þnh hai biÕn lµ côc bé cho ch¬ng tr×nh con nµy, vµ c¸c tham biÕn ban ®Çu trong mét m¶ng côc bé ®Æc biÖt gäi lµ @_.)

Hai dßng tiÕp lµm s¹ch tªn, còng gièng nh b¶n tríc cña ch-¬ng tr×nh.

C©u lÖnh if-elsif-else quyÕt ®Þnh xem tõ ®îc ®o¸n ($someguess) lµ cã ®óng cho tªn ($somename) hay kh«ng. Randal kh«ng nªn lµm nã thµnh ch¬ng tr×nh con nµy, nhng ngay c¶ nÕu nã cã, th× dï tõ nµo ®îc ®o¸n còng ®Òu OK c¶.

BiÓu thøc cuèi cïng ®îc tÝnh trong ch¬ng tr×nh con lµ cho l¹i gi¸ trÞ. Chóng ta sÏ thÊy c¸ch cho l¹i gi¸ trÞ ®îc dïng sau khi t«i kÕt thóc viÖc m« t¶ ®Þnh nghÜa vÒ ch¬ng tr×nh con.

PhÐp kiÓm tra cho phÇn elsif tr«ng cã phøc t¹p h¬n mét chót - ta h·y chia nã ra:

($words{$somename} || “®å c¸u kØnh”) eq $someguessVËt thø nhÊt bªn trong dÊu ngoÆc lµ m¶ng kÕt hîp quen

thuéc cña ta, cho mét gi¸ trÞ nµo ®ã tõ %words dùa trªn kho¸ $somename. To¸n tö ®øng gi÷a gi¸ trÞ ®ã vµ x©u ®å c¸u kØnh lµ to¸n tö || (phÐp hoÆc logic) nh ®îc dïng trong C vµ awk vµ c¸c vá kh¸c. NÕu viÖc tra cøu tõ m¶ng kÕt hîp cã mét gi¸ trÞ (nghÜa lµ kho¸ $somename lµ trong m¶ng), th× gi¸ trÞ cña biÓu thøc lµ gi¸ trÞ ®ã. NÕu kho¸ kh«ng t×m ®îc, th× x©u ®å c¸u kØnh sÏ ®îc dïng thay. §©y chÝnh lµ mét vËt kiÓu Perl thêng lµm - x¸c ®Þnh mét biÓu thøc nµo ®ã, vµ råi ®a ra mét gi¸ trÞ mÆc ®Þnh b»ng c¸ch dïng || nÕu biÓu thøc nµy cã thÓ trë thµnh sai.

Trong mäi trêng hîp, dï ®ã lµ mét gi¸ trÞ tõ m¶ng kÕt hîp, hay gi¸ trÞ mÆc ®Þnh ®å c¸u kØnh, chóng ta ®Òu so s¸nh nã víi bÊt k× c¸i g× ®îc ®o¸n. NÕu viÖc so s¸nh lµ ®óng th× ta cho l¹i 1, nÕu kh«ng ta cho l¹i 0.

Page 24: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

B©y giê ta h·y tÝch hîp tÊt c¶ nh÷ng ®iÒu nµy víi phÇn cßn l¹i cña ch¬ng tr×nh:

#! /usr/bin/perl%words = (“fred”, “camel”, “barney”, “llama”,

“betty”, “oyster”, “wilma”, “oyster”) ;print “Tªn b¹n lµ g×?” ;$name = <STDIN> ;chop($name);if ($name =~ /^randal\b/i ) { # trë l¹i c¸ch kh¸c

print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;} else {

print “Xin chµo, $original_name!\n”; # chµo th«ng thêngprint “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ( ! &good_word($name, $guess)) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} }

[ ... thªm vµo ®Þnh nghÜa cña &good_word ë ®©y ...]

Chó ý r»ng chóng ta ®· quay trë l¹i víi biÓu thøc chÝnh qui ®Ó kiÓm tra Randal, v× b©y giê kh«ng cÇn kÐo mét phÇn tªn thø nhÊt vµ chuyÓn nã thµnh ch÷ thêng, chõng nµo cßn liªn quan tíi ch¬ng tr×nh chÝnh.

Sù kh¸c biÖt lín lµ chu tr×nh while cã chøa &good_word. T¹i ®©y, chóng ta thÊy mét lêi gäi tíi ch¬ng tr×nh con, truyÒn cho nã hai ®èi, $name vµ $guess. Bªn trong ch¬ng tr×nh con nµy, gi¸ trÞ cña $somename ®îc ®Æt tõ tham biÕn thø nhÊt, trong trêng hîp nµy lµ $name. Gièng thÕ, $someguess ®îc ®Æt tõ tham biÕn thø hai, $guess.

Gi¸ trÞ do ch¬ng tr×nh con cho l¹i (hoÆc 1 hoÆc 0, nhí l¹i ®Þnh nghÜa ®· nªu tríc ®©y) lµ ©m víi to¸n tö tiÒn tè ! (phÐp phñ ®Þnh logic). Nh trong C, to¸n tö nµy cho l¹i ®óng nÕu biÓu thøc ®i sau lµ sai, vµ ngîc l¹i. KÕt qu¶ cña phÐp phñ ®Þnh nµy sÏ kiÓm so¸t chu tr×nh while. B¹n cã thÓ ®äc ®iÒu nµy lµ “trong khi kh«ng ph¶i lµ tõ ®óng...”. NhiÒu ch¬ng tr×nh Perl viÕt tèt ®äc rÊt gièng tiÕng Anh, ®a l¹i cho b¹n mét chót tù do víi Perl hay tiÕng Anh. (Nhng b¹n ch¾c ch¾n kh«ng ®o¹t gi¶i Pulitzer theo c¸ch ®ã.)

Page 25: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Chó ý r»ng ch¬ng tr×nh con nµy gi¶ thiÕt r»ng gi¸ trÞ cña m¶ng %words ®îc ch¬ng tr×nh chÝnh ®Æt. §iÒu nµy kh«ng ®Æc biÖt lµ hay, nhng ch¼ng cã g× so s¸nh ®îc víi static cña C ®èi víi ch¬ng tr×nh con - nãi chung, tÊt c¶ c¸c biÕn nÕu kh«ng nãi kh¸c ®i mµ ®îc t¹o ra víi to¸n tö local() th× ®Òu lµ toµn côc ®èi víi toµn bé ch¬ng tr×nh. Trong thùc tÕ, ®©y chØ lµ vÊn ®Ò nhá, vµ ngêi ta th× cã ®îc tÝnh s¸ng t¹o vÒ c¸ch ®Æt tªn biÕn dµi h¹n.

ChuyÓn danh s¸ch tõ bÝ mËt vµo tÖp riªng biÖtGi¶ sö ta muèn dïng chung danh s¸ch tõ bÝ mËt cho ba ch-

¬ng tr×nh. NÕu ta cÊt gi÷ danh s¸ch tõ nh ta ®· lµm th× ta sÏ cÇn ph¶i thay ®æi tÊt c¶ ba ch¬ng tr×nh nµy khi Betty quyÕt ®Þnh r»ng tõ bÝ mËt cña c« sÏ lµ swine thay v× oyster. §iÒu nµy cã thÓ thµnh phiÒn phøc, ®Æc biÖt khi xem xÐt tíi viÖc Betty l¹i thêng xuyªn thÝch thay ®æi ý ®Þnh.

Cho nªn, ta h·y ®Æt danh s¸ch tõ vµo mét tÖp, vµ råi ®äc tÖp nµy ®Ó thu ®îc danh s¸ch tõ vµo trong ch¬ng tr×nh. §Ó lµm ®iÒu nµy, ta cÇn t¹o ra mét kªnh vµo/ra ®îc gäi lµ tíc hiÖu tÖp. Ch¬ng tr×nh Perl cña b¹n sÏ tù ®éng lÊy ba tíc hiÖu tÖp gäi lµ STDIN, STDOUT vµ STDERR, t¬ng øng víi ba kªnh vµo ra chuÈn cho ch¬ng tr×nh UNIX. Chóng ta còng ®· dïng tíc hiÖu STDIN ®Ó ®äc d÷ liÖu tõ ngêi ch¹y ch¬ng tr×nh. B©y giê, ®Êy chØ lµ viÖc lÊy mét tíc hiÖu kh¸c ®Ó g¾n víi mét tÖp do ta t¹o ra.

Sau ®©y lµ mét ®o¹n m· nhá ®Ó lµm ®iÒu ®ã:sub init_words {

open (WORDSLIST, “wordslist”);while ($name = <WORDSLIST>) {

chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}close (WORDSLIST);

}T«i ®Æt nã vµo mét ch¬ng tr×nh con ®Ó cho t«i cã thÓ gi÷

phÇn chÝnh cña ch¬ng tr×nh kh«ng bÞ lén xén. §iÒu nµy còng cã nghÜa lµ vµo thêi ®iÓm sau (híng dÉn: mét vµi lÇn «n l¹i cuéc ®i d¹o nµy), t«i cã thÓ thay ®æi n¬i cÊt gi÷ danh s¸ch tõ, hay thËm chÝ ®Þnh d¹ng cña danh s¸ch.

Page 26: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

§Þnh d¹ng ®îc chän bÊt k× cho danh s¸ch tõ lµ mét kho¶n môc trªn mét dßng, víi tªn vµ tõ, lu©n phiªn. Cho nªn, víi c¬ së d÷ liÖu hiÖn t¹i cña chóng ta, chóng ta cã c¸i tùa nh thÕ nµy:

fredcamelbarneyllamabettyoysterwilmaoysterTo¸n tö open() t¹o ra mét tíc hiÖu tÖp cã tªn WORDSLIST

b»ng c¸ch liªn kÕt nã víi mét tÖp mang tªn wordslist trong danh môc hiÖn t¹i. Lu ý r»ng tíc hiÖu tÖp kh«ng cã kÝ tù lµ l¹ phÝa tr-íc nã nh ba kiÓu biÕn vÉn cã. Còng vËy, tíc hiÖu tÖp nãi chung lµ ch÷ hoa - mÆc dÇu chóng kh«ng nhÊt thiÕt ph¶i lµ nh thÕ - bëi nh÷ng lÝ do sÏ nªu chi tiÕt vÒ sau.

Chu tr×nh while ®äc c¸c dßng tõ tÖp wordslist (qua tíc hiÖu tÖp WORDSLIST) mçi lÇn mét dßng. Mçi dßng ®Òu ®îc cÊt gi÷ trong biÕn $name. Khi ®¹t ®Õn cuèi tÖp th× gi¸ trÞ cho l¹i bëi to¸n tö <WORDSLIST> lµ x©u rçng* , mµ sÏ sai cho cho tr×nh while, vµ kÕt thóc nã. §ã lµ c¸ch chóng ta ®i ra ë cuèi.

MÆt kh¸c, trêng hîp th«ng thêng lµ ë chç chóng ta ®· ®äc mét dßng (kÓ c¶ dÊu dßng míi) vµo trong $name. Tríc hÕt, ta bá dÊu dßng míi b»ng viÖc dïng to¸n tö chop(). Råi, ta ph¶i ®äc dßng tiÕp ®Ó lÊy tõ bÝ mËt, gi÷ nã trong biÕn $word. Nã n÷a còng ph¶i bá dÊu dßng míi ®i.

Dßng cuèi cïng cña chu tr×nh while ®Æt $word vµo trong %words víi kho¸ $name, cho nªn phÇn cßn l¹i cña ch¬ng tr×nh cã thÓ th©m nhËp vµo nã vÒ sau.

Mét khi tÖp ®· ®îc ®äc xong th× cã thÓ bá tíc hiÖu tÖp b»ng to¸n tö close(). (Tíc hiÖu tÖp dÉu sao còng ®îc tù ®éng ®ãng l¹i khi ch¬ng tr×nh tho¸t ra, nhng t«i ®ang ®Þnh lµm cho gän.)

§Þnh nghÜa ch¬ng tr×nh con nµy cã thÓ ®i sau hay tríc ch-¬ng tr×nh con kh¸c. Vµ chóng ta gäi tíi ch¬ng tr×nh con thay v× ®Æt %words vµo chç b¾t ®Çu cña ch¬ng tr×nh, cho nªn mét c¸ch ®Ó bao bäc tÊt c¶ nh÷ng ®iÒu nµy cã thÓ gièng thÕ nµy:

#! /usr/bin/perl* VÒ mÆt kÜ thuËt th× ®Êy l¹i lµ undef, nhng còng ®ñ gÇn cho th¶o luËn nµy

Page 27: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

&init_words;print “Tªn b¹n lµ g×?” ;$name = <STDIN> ;chop($name);if ($name =~ /^randal\b/i ) { # trë l¹i c¸ch kh¸c

print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;} else {

print “Xin chµo, $original_name!\n”; # chµo th«ng thêngprint “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ( ! &good_word($name, $guess)) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} } ## ch¬ng tr×nh con tõ ®©y xuèngsub init_words {

open (WORDSLIST, “wordslist”);while ($name = <WORDSLIST>) {

chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}close (WORDSLIST);

}sub good_word {

local($somename, $someguess) = @_; # tªn tham biÕn$somename =~ s/\W.*//; # bá mäi thø sau tõ ®Çu$somename =~ tr/A-Z/a-z/; # mäi thø thµnh ch÷ thêngif ($somename eq “randal”) { # kh«ng nªn ®o¸n

1; #gi¸ trÞ cho l¹i lµ true} elsif (($words{$somename} || “®å c¸u kØnh”) eq

$someguess) {1; # gi¸ trÞ cho l¹i lµ true

} else {0; # cho l¹i gi¸ trÞ false

}}B©y giê nã b¾t ®Çu tr«ng gièng mét ch¬ng tr×nh trëng

Page 28: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

thµnh hoµn toµn. Chó ý ®Õn dßng thùc hiÖn ®îc ®Çu tiªn lµ lêi gäi tíi &init_words. Kh«ng cã tham biÕn nµo ®îc truyÒn c¶, cho nªn chóng ta ®îc tù do bá ®i dÊu ngoÆc trßn. Còng vËy, gi¸ trÞ cho l¹i kh«ng ®îc dïng trong tÝnh to¸n thªm, th× còng lµ tèt v× ta ®· kh«ng cho l¹i ®iÒu g× ®¸ng ®Ó ý. (Gi¸ trÞ cña close() th«ng thêng lµ ®óng.)

To¸n tö open() còng ®îc dïng ®Ó më c¸c tÖp ®a ra, hay më ch¬ng tr×nh nh tÖp (®· ®îc biÓu diÔn ng¾n gän). Tuy thÕ, viÖc vÐt hÕt vÒ open() sÏ ®îc nªu vÒ sau trong cuèn s¸ch nµy, trong Ch¬ng 10, Tíc hiÖu tÖp vµ kiÓm tra tÖp.§¶m b¶o mét lîng an toµn gi¶n dÞ

“Danh s¸ch c¸c tõ bÝ mËt ph¶i thay ®æi Ýt nhÊt mét lÇn mçi tuÇn!” «ng Trëng ban danh s¸ch tõ bÝ mËt kªu lªn. Th«i ®îc, chóng ta kh«ng thÓ buéc danh s¸ch nµy kh¸c ®i, nhng chóng ta cã thÓ Ýt nhÊt còng ®a ra mét c¶nh b¸o nÕu danh s¸ch tõ bÝ mËt cßn cha ®îc thay ®æi trong h¬n mét tuÇn.

C¸ch tèt nhÊt ®Ó lµm ®iÒu nµy lµ trong ch¬ng tr×nh con &init_words - chóng ta ®· nh×n vµo tÖp ë ®ã. To¸n tö Perl -M cho l¹i tuæi tÝnh theo ngµy tõ mét tÖp hay tíc hiÖu tÖp ®· ®îc thay ®æi tõ lÇn tríc, cho nªn ta chØ cÇn xem liÖu gi¸ trÞ nµy cã lín h¬n bÈy hay kh«ng ®èi víi tíc hiÖu tÖp WORDSLIST:

sub init_words {open (WORDSLIST, “wordslist”);if (-M WORDSLIST > 7) { # tu©n thñ theo ®êng lèi

quan liªudie “RÊt tiÕc, danh s¸ch tõ cò h¬n bÈy ngµy råi.”;

}while ($name = <WORDSLIST>) {

chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}close (WORDSLIST);

}Gi¸ trÞ cña -M WORDSLIST ®îc so s¸nh víi bÈy, vµ nÕu lín

h¬n, thÕ th× ta vi ph¹m vµo ®êng lèi råi. T¹i ®©y, ta thÊy mét to¸n tö míi, to¸n tö die, mµ cho in ra mét th«ng b¸o trªn thiÕt bÞ cuèi* , vµ bá ch¬ng tr×nh trong mét có bæ nhµo r¬i xuèng.

PhÇn cßn l¹i cña ch¬ng tr×nh vÉn kh«ng ®æi, cho nªn trong * Thùc t¹i lµ STDERR, nhng ®Êy th«ng thêng lµ mµn h×nh

Page 29: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

mèi quan t©m tíi viÖc tiÕt kiÖm c©y cèi, t«i sÏ kh«ng lÆp l¹i nã ë ®©y.

Bªn c¹nh viÖc lÊy tuæi cña tÖp, ta còng cã thÓ t×m ra ngêi chñ cña nã, kÝch cì, thêi gian th©m nhËp, vµ mäi thø kh¸c mµ UNIX duy tr× vÒ tÖp. NhiÒu ®iÒu h¬n ®îc tr×nh bÇy trong Ch-¬ng 10.C¶nh b¸o ai ®ã khi mäi viÖc ®i sai

Ta h·y xem ta cã thÓ lµm cho hÖ thèng bÞ sa lÇy thÕ nµo khi ta göi mét mÈu th ®iÖn tö mçi lÇn cho mét ai ®ã ®o¸n tõ bÝ mËt cña hä kh«ng ®óng. Ta cÇn söa ®æi mçi ch¬ng tr×nh con &good_word (nhê cã tÝnh m« ®un) v× ta cã tÊt c¶ th«ng tin ngay ®©y.

Th sÏ ®îc göi cho b¹n nÕu b¹n gâ ®Þa chØ th cña riªng m×nh vµo chç mµ ch¬ng tr×nh nãi “§Þa chØ b¹n ë ®©y.” §©y lµ ®iÒu ta ph¶i lµm - ngay tríc khi tr¶ 0 vÒ tõ ch¬ng tr×nh con, ta t¹o ra mét tíc hiÖu tÖp mµ thùc t¹i lµ mét tiÕn tr×nh (mail), gièng nh:

sub good_word {local($somename, $someguess) = @_; # tªn tham biÕn$somename =~ s/\W.*//; # bá mäi thø sau tõ ®Çu$somename =~ tr/A-Z/a-z/; # mäi thø thµnh ch÷ thêngif ($somename eq “randal”) { # kh«ng nªn ®o¸n

1; #gi¸ trÞ cho l¹i lµ true} elsif (($words{$somename} || “®å c¸u kØnh”) eq

$someguess) {1; # gi¸ trÞ cho l¹i lµ true

} else {open(MAIL, “|mail §Þa_chØ_b¹n_ë_®©y”);

print MAIL “tin xÊu: $somename ®· ®o¸n $someguess\n”;

0; # cho l¹i gi¸ trÞ false}

}C©u lÖnh míi thø nhÊt ë ®©y lµ open(), mµ cã mét kÝ hiÖu

®êng èng (|) trong tªn tÖp. §©y lµ mét chØ dÉn ®Æc biÖt r»ng ta ®ang më mét chØ lÖnh thay v× mét tÖp. V× ®êng èng lµ t¹i chç b¾t ®Çu cña chØ lÖnh nªn ta ®ang më mét chØ lÖnh ®Ó ta cã thÓ ghi lªn nã. (nÕu b¹n ®Æt ®êng èng t¹i cuèi thay v× ®Çu th× b¹n cã thÓ ®äc c¸i ra cña chØ lÖnh.)

C©u lÖnh tiÕp, print, chØ ra r»ng mét tíc hiÖu tÖp gi÷a tõ

Page 30: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

kho¸ print vµ gi¸ trÞ ®îc in ra chän tíc hiÖu tÖp ®ã lµm c¸i ra, thay v× STDOUT* . §iÒu nµy cã nghÜa lµ th«ng b¸o sÏ kÕt thóc nh c¸i vµo cho chØ lÖnh mail.

Cuèi cïng, ta ®ãng tíc hiÖu tÖp, mµ sÏ b¾t ®Çu ®Ó mail göi d÷ liÖu cña nã theo c¸ch cña nã.

§Ó cho ®óng, chóng ta cã thÓ göi c©u tr¶ lêi ®óng còng nh c©u tr¶ lêi sai, nhng råi ai ®ã ®äc qua vai t«i (hay nóp trong hÖ thèng th) trong khi t«i ®ang ®äc th mµ cã thÓ lÊy qu¸ nhiÒu th«ng tin cã Ých.

Perl cã thÓ còng gäi c¶ c¸c lÖnh víi viÖc kiÓm so¸t chÝnh x¸c trªn danh s¸ch ®èi, më c¸c tíc hiÖu tÖp, hay thËm chÝ l«i ra c¶ b¶n sao cña ch¬ng tr×nh hiÖn t¹i, vµ thùc hiÖn hai (hay nhiÒu) b¶n sao song song. Backquotes (gièng nh backquotes cña vá) cho mét c¸ch dÔ dµng n¾m ®îc c¸i ra cña mét chØ lÖnh nh d÷ liÖu. TÊt c¶ nh÷ng ®iÒu nµy sÏ ®îc m« t¶ trong Ch¬ng 14, Qu¶n lÝ tiÕn tr×nh, cho nªn b¹n nhí ®äc.NhiÒu tÖp tõ bÝ mËt trong danh môc hiÖn t¹i

Ta h·y thay ®æi ®Þnh nghÜa cña tªn tÖp tõ bÝ mËt mét chót. Thay v× tÖp ®îc ®Æt tªn lµ wordslist, th× ta h·y t×m bÊt k× c¸i g× trong danh môc hiÖn t¹i mµ cã tËn cïng lµ .secret. Víi líp vá, ta nãi:

echo *.secret®Ó thu ®îc mét liÖt kª ng¾n gän cho tÊt c¶ c¸c tªn nµy. Nh l¸t n÷a b¹n sÏ thÊy, Perl dïng mét có ph¸p tªn chïm t¬ng tù.

Ta lÊy l¹i ®Þnh nghÜa &init_words :sub init_words {

while ($filename = <*.secret>) {open (WORDSLIST, $filename);if (-M WORDSLIST > 7) {

while ($name = <WORDSLIST>) {chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}}close (WORDSLIST);

}}

* VÒ mÆt kÜ thuËt th× tíc hiÖu tÖp nµy hiÖn ®îc chän. §iÒu ®ã sÏ ®îc nãi nhiÒu tíi vÒ sau.

Page 31: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Tríc hÕt, t«i ®· bao mét chu tr×nh while míi quanh phÇn lín ch¬ng tr×nh con cña b¶n cò. §iÒu míi ë ®©y lµ to¸n tö <*.secret>. §iÒu nµy ®îc gäi lµ nóm tªn tÖp, bëi lÝ do lÞch sö. Nã lµm viÖc rÊt gièng <STDIN>, ë chç mçi lÇn ®îc th©m nhËp tíi, nã ®Òu cho l¹i gi¸ trÞ tiÕp: tªn tÖp kÕ tiÕp s¸nh víi mÉu cña vá, trong trêng hîp nµy lµ *.secret. Khi kh«ng cã tªn tÖp thªm n÷a ®îc cho l¹i th× nóm tªn tÖp cho x©u rçng* .

Cho nªn nÕu danh môc hiÖn t¹i cã chøa fred.secret vµ barney.secret, th× $filename lµ barney.secret ë bíc ®Çu qua chu tr×nh while (tªn tíi theo trËt tù s¾p cña b¶ng ch÷). ë bíc thø hai, $filename lµ fred.secret. Vµ kh«ng cã t×nh huèng thø ba v× nóm cho l¹i x©u rçng khi lÇn thø ba ®îc gäi tíi, lµm cho chu tr×nh while thµnh sai, g©y ra viÖc ra khái ch¬ng tr×nh con.

Bªn trong chu tr×nh while, chóng ta më tÖp vµ kiÓm chøng r»ng nã ®ñ gÇn ®©y (Ýt h¬n bÈy ngµy tõ lÇn söa ®æi tríc). Víi nh÷ng tÖp ®ñ gÇn, chóng ta duyÖt qua nh tríc.

Chó ý r»ng nÕu kh«ng cã tÖp nµo s¸nh víi *.secret vµ l¹i Ýt h¬n bÈy ngµy th× ch¬ng tr×nh con sÏ ra mµ kh«ng ®Æt bÊt k× tõ bÝ mËt nµo vµo m¶ng %words. §iÒu ®ã cã nghÜa lµ mäi ngêi sÏ ph¶i dïng tõ ®å c¸u kØnh. ThÕ còng ®îc. (Víi m· thËt, t«i sÏ thªm mét kiÓm tra nµo ®ã vÒ sè c¸c « trong %words tríc khi cho l¹i, vµ die nÕu nã kh«ng tèt. B¹n h·y xem to¸n tö keys() khi ta lÊy m¶ng kÕt hîp trong Ch¬ng 5, M¶ng kÕt hîp.)Nhng chóng ta biÕt hä lµ ai!

§îc råi, chóng ta ®· hái tªn ngêi dïng khi trong thùc tÕ chóng ta cã thÓ lÊy tªn cña ngêi dïng hiÖn t¹i tõ hÖ thèng, b»ng viÖc dïng mét vµi dßng nh:

@password = getpwuid($<); # lÊy d÷ liÖu mËt hiÖu$name = $password[6]; # lÊy trêng GCOS$name =~ s/,.*//; # vøt ®i mäi thø sau dÊu phÈy ®Çu

tiªnDßng ®Çu tiªn dïng sè hiÖu ngêi dïng ID cña UNIX (thêng ®-

îc gäi lµ UID), tù ®éng hiÖn diÖn trong biÕn Perl $<. To¸n tö getpwuid() (®îc ®Æt tªn gièng nh tr×nh th viÖn chuÈn) lÊy sè hiÖu UID vµ cho l¹i th«ng tin tõ tÖp mËt hiÖu (hay cã thÓ mét sè c¬ së d÷ liÖu kh¸c) nh mét danh s¸ch. Chóng ta ®¸nh dÊu th«ng tin nµy trong m¶ng @password.

Kho¶n môc thø bÈy cña m¶ng @password (chØ sè 6) lµ trêng * L¹i undef lÇn n÷a

Page 32: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

GCOS, mµ thêng lµ mét x©u cã chøa danh s¸ch c¸c gi¸ trÞ c¸c nhau bëi dÊu phÈy. Gi¸ trÞ ®Çu tiªn cña x©u ®ã thêng lµ tªn ®Çy ®ñ cña ngêi.

Mét khi hai c©u lÖnh ®Çu nµy ®· hoµn tÊt th× chóng ta cã toµn bé trêng GCOS trong $name. Tªn ®Çy ®ñ chØ lµ phÇn thø nhÊt cña x©u tríc dÊu phÈy ®Çu tiªn, cho nªn c©u lÖnh thø ba vøt ®i mäi thø sau dÊu phÈy thø nhÊt.

G¾n tÊt c¶ nh÷ng ®iÒu ®ã víi phÇn cßn l¹i cña ch¬ng tr×nh (nh ®· ®îc söa bëi hai thay ®æi ch¬ng tr×nh con kh¸c)

#! /usr/bin/perl&init_words;@password = getpwuid($<); # lÊy d÷ liÖu mËt hiÖu$name = $password[6]; # lÊy trêng GCOS$name =~ s/,.*//; # vøt ®i mäi thø sau dÊu phÈy ®Çu

tiªnif ($name =~ /^randal\b/i ) { # trë l¹i c¸ch kh¸c

print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;} else {

print “Xin chµo, $name!\n”; # chµo th«ng thêngprint “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ( ! &good_word($name, $guess)) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} }

sub init_words {while ($filename = <*.secret>) {

open (WORDSLIST, $filename);if (-M WORDSLIST > 7) {

while ($name = <WORDSLIST>) {chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}}close (WORDSLIST);

}

Page 33: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}sub good_word {

local($somename, $someguess) = @_; # tªn tham biÕn$somename =~ s/\W.*//; # bá mäi thø sau tõ ®Çu$somename =~ tr/A-Z/a-z/; # mäi thø thµnh ch÷ thêngif ($somename eq “randal”) { # kh«ng nªn ®o¸n

1; #gi¸ trÞ cho l¹i lµ true} elsif (($words{$somename} || “®å c¸u kØnh”) eq

$someguess) {1; # gi¸ trÞ cho l¹i lµ true

} else {open(MAIL, “|mail §Þa_chØ_b¹n_ë_®©y”);

print MAIL “tin xÊu: $somename ®· ®o¸n $someguess\n”;

0; # cho l¹i gi¸ trÞ false}

}Chó ý r»ng chóng ta kh«ng cßn cÇn hái ngêi dïng vÒ tªn ngêi

Êy n÷a - chóng ta ®· biÕt nã!Perl cung cÊp nhiÒu tr×nh th©m nhËp c¬ së d÷ liÖu hÖ

thèng ®Ó l«i ra nh÷ng gi¸ trÞ tõ c¬ së d÷ liÖu mËt hiÖu, nhãm, m¸y chñ, m¹ng, dÞch vô vµ giao thøc. C¶ viÖc tra cøu riªng (nh ®îc tr×nh bÇy ë trªn) vµ viÖc duyÖt sè lín còng ®Òu ®îc Perl hç trî.LiÖt kª c¸c tõ bÝ mËt

Råi «ng phô tr¸ch danh s¸ch tõ bÝ mËt l¹i muèn cã mét b¸o c¸o vÒ tÊt c¶ nh÷ng tõ bÝ mËt hiÖn ®ang dïng, vµ chóng cò ®Õn ®©u. NÕu ta g¹t sang bªn ch¬ng tr×nh tõ bÝ mËt mét lóc, th× ta sÏ cã thêi gian ®Ó viÕt mét ch¬ng tr×nh b¸o c¸o cho «ng phô tr¸ch.

Tríc hÕt, ta h·y lÊy ra tÊt c¶ c¸c tõ bÝ mËt, b»ng viÖc ¨n c¾p mét ®o¹n m· trong ch¬ng tr×nh con &init_words:

while ($filename = <*.secret>) {open (WORDSLIST, $filename);if (-M WORDSLIST > 7) {

while ($name = <WORDSLIST>) {chop ($name);$word = <WORDSLIST>;chop($word);

### chÊt liÖu míi sÏ ®a vµo ®©y}

Page 34: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}close (WORDSLIST);

}T¹i ®iÓm cã ®¸nh dÊu “chÊt liÖu míi sÏ ®a vµo ®©y,” ta

biÕt ba ®iÒu: tªn cña tÖp (trong $filename), tªn mét ai ®ã (trong $name), vµ r»ng tõ bÝ mËt cña mét ngêi (trong $Word). Sau ®©y lµ chç ®Ó dïng c«ng cô sinh b¸o c¸o cña Perl. Ta ®Þnh nghÜa mét ®Þnh d¹ng ë ®©u ®ã trong ch¬ng tr×nh (th«ng thêng gÇn cuèi, gièng nh ch¬ng tr×nh con):

format STDOUT = @<<<<<<<<<<<<<<< @<<<<<<<<<<

@<<<<<<<<<<<<<<$filename, $name, $word.§Þnh nghÜa ®Þnh d¹ng nµy b¾t ®Çu víi format STDOUT =,

vµ kÕt thóc víi mét dÊu chÊm. Hai dßng ë gi÷a lµ chÝnh ®Þnh d¹ng. Dßng ®Çu cña ®Þnh d¹ng nµy lµ dßng ®Þnh nghÜa trêng vèn x¸c ®Þnh sè lîng, chiÒu dµi vµ kiÓu cña trêng. Víi ®Þnh d¹ng nµy, chóng ta cã ba trêng. Dßng ®i sau dßng ®Þnh nghÜa trêng bao giê còng lµ dßng gi¸ trÞ trêng. Dßng gi¸ trÞ cho mét danh s¸ch c¸c biÓu thøc mµ sÏ ®îc tÝnh khi ®Þnh d¹ng nµy ®îc dïng, vµ kÕt qu¶ cña nh÷ng biÓu thøc ®ã sÏ ®îc g¾n vµo trong c¸c trêng ®· ®îc x¸c ®Þnh trªn dßng tríc ®ã.

Ta gäi ®Þnh d¹ng nµy víi to¸n tö write, nh thÕ nµy:#!/usr/bin/perlwhile ($filename = <*.secret>) {

open (WORDSLIST, $filename);if (-M WORDSLIST < 7) { while ($name = <WORDSLIST>) {

chop($name);$word = <WORDSLIST>chop($word);write; # gäi ®Þnh d¹ng STDOUT tíi STDOUT

}}close (WORDSLIST)

}format STDOUT = @<<<<<<<<<<<<<<< @<<<<<<<<<<

@<<<<<<<<<<<<<<$filename, $name, $word.

Page 35: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Khi ®Þnh d¹ng nµy ®îc gäi tíi, th× Perl sÏ tÝnh c¸c biÓu thøc trêng vµ sinh ra mét dßng mµ nã göi ra tíc hiÖu tÖp STDOUT. V× write lµ ®îc gäi mét lÇn mçi khi ®i qua chu tr×nh nªn ta sÏ thu ®îc mét lo¹t c¸c dßng víi v¨n b¶n theo cét, mçi dßng cho mét tõ bÝ mËt.

Hõm. Chóng ta cßn cha cã nh·n cho c¸c cét. Mµ ®iÒu ®ã th× còng dÔ th«i. Ta chØ cÇn thªm vµo ®Þnh d¹ng trªn ®Çu trang, nh:

format STDOUT_TOP =Page @<<$%

Tªn tÖp Tªn Tõ========== ======== ==========.§Þnh d¹ng nµy mang tªn STDOUT_TOP, vµ sÏ ®îc dïng ®Çu

tiªn ngay khi gäi tíi ®Þn hd¹ng STDOUT, råi l¹i sau 60 lÇn ®a ra STDOUT th× nã l¹i ®îc sinh ra. C¸c tiªu ®Ò cét ë ®©y th¼ng hµng víi c¸c cét trong ®Þnh d¹ng STDOUT, cho nªn mäi thø khíp vµo nhau.

Dßng ®Çu tiªn trong ®Þnh d¹ng nµy chØ ra mét v¨n b¶n h»ng nµo ®ã (Page) cïng víi viÖc ®Þnh nghÜa trêng ba kÝ tù. Dßng sau lµ dßng gi¸ trÞ trêng, ë ®©y víi mét biÓu thøc. BiÓu thøc nµy lµ biÕn $%, gi÷ sè trang ®îc in ra - mét gi¸ trÞ rÊt cã Ých trong ®Þnh d¹ng ®Çu trang.

Dßng thø ba cña ®Þnh d¹ng nµy ®Ó trèng. V× dßng nµy kh«ng chøa bÊt k× trêng nµo nªn dßng sau nã kh«ng ph¶i lµ dßng gi¸ trÞ trêng. Dßng trèng nµy ®îc sao trùc tiÕp lªn c¸i ra, t¹o ra mét dßng trèng gi÷a sè trang vµ tiªu ®Ò cét díi.

Hai dßng cuèi cña ®Þnh d¹ng nµy còng kh«ng chøa trêng nµo, cho nªn chóng ®îc sao trùc tiÕp ra c¸i ra. Do vËy ®Þnh d¹ng nµy sinh ra bèn dßng, mét trong ®ã cã mét phÇn bÞ thay ®æi qua mçi trang.

ChØ cÇn thªm ®Þnh nghÜa nµy vµo ch¬ng tr×nh tríc lµ nã lµm viÖc. Perl ®Ó ý ®Õn ®Þnh d¹ng ®Çu trang tù ®éng.

Perl còng cã c¸c trêng ®îc ®Þnh t©m hay c¨n lÒ ph¶i, vµ hç trî cho miÒn ®o¹n ®îc rãt kÝn. SÏ cã nhiÒu vÊn ®Ò vÒ ®iÒu nµy h¬n khi ta ®i vµo c¸c ®Þnh d¹ng trong Ch¬ng 11, §Þnh d¹ng.

Page 36: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Lµm cho danh s¸ch tõ cò ®ã ®¸ng lu ý h¬nKhi ta ®äc qua c¸c tÖp *.secret trong danh môc hiÖn t¹i, ta

cã thÓ t×m thÊy c¸c tÖp qu¸ cò. Cho tíi nay, ta ®¬n thuÇn nhÈy qua nh÷ng tÖp nµy. Ta h·y ®i thªm mét bíc n÷a - ta sÏ ®æi tªn chóng thµnh *.secret.old ®Ó cho ls cña danh môc sÏ nhanh chãng cho ta nh÷ng tÖp nµo qu¸ cò, ®¬n thuÇn theo tªn.

Sau ®©y lµ c¸ch thøc thÓ hiÖn cho ch¬ng tr×nh con &init_words víi söa ®æi nµy:

sub init_words {while ($filename = <*.secret>) {

open (WORDSLIST, $filename);if (-M WORDSLIST > 7) {

while ($name = <WORDSLIST>) {chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}} else { # ®æi tªn tÖp ®Ó nã ®¸ng ®Ó ý h¬n

rename($filename, “$filename.old”);}close (WORDSLIST);

}}B¹n h·y chó ®Õn phÇn else míi cña viÖc kiÓm tra tuæi. NÕu

tÖp cò h¬n bÈy ngµy, th× nã sÏ ®îc ®æi tªn b»ng to¸n tö rename(). To¸n tö nµy lÊy hai tham biÕn, ®æi tÖp cã tªn trong tham biÕn thø nhÊt thµnh tªn trong tham biÕn thø hai.

Perl cã mét ph¹m vi ®Çy ®ñ c¸c to¸n tö thao t¸c tÖp - gÇn nh bÊt k× c¸i g× b¹n cã thÓ thùc hiÖn cho mét tÖp trong ch¬ng tr×nh C, b¹n còng cã thÓ lµm tõ Perl.

Duy tr× mét c¬ së d÷ liÖu ®o¸n ®óng cuèi cïngTa h·y gi÷ l¹i dÊu vÕt khi nµo viÖc ®o¸n ®óng gÇn nhÊt ®·

®îc thùc hiÖn cho mçi ngêi dïng. Mét cÊu tróc d÷ liÖu mµ dêng nh míi tho¸ng nh×n th× cã vÎ ®îc lµ m¶ng kÕt hîp. Ch¼ng h¹n, c©u lÖnh:

$last_good{$name} = time ;g¸n thêi gian UNIX hiÖn t¹i (mét sè nguyªn lín qu·ng 700

Page 37: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

triÖu, chØ ra sè gi©y) cho mét phÇn tö cña %last_good mµ cã tªn víi kho¸ ®ã. Qua thêi gian, ®iÒu nµy sÏ dêng ch cho ta mét c¬ së d÷ liÖu chØ ra thêi ®iÓm gÇn nhÊt mµ tõ bÝ mËt ®· ®îc ®o¸n ®óng cho tõng ngêi dïng ®· gäi tíi ch¬ng tr×nh nµy.

Nhng, m¶ng l¹i kh«ng tån t¹i gi÷a nh÷ng lÇn gäi ch¬ng tr×nh. Mçi lÇn ch¬ng tr×nh nµy ®îc gäi th× mét m¶ng míi l¹i ®îc h×nh thµnh, cho nªn nhiÒu nhÊt th× ta t¹o ra ®îc m¶ng mét phÇn tö vµ råi lËp tøc l¹i quªn mÊt nã khi ch¬ng tr×nh ra.

To¸n tö dbmopen() ¸nh x¹ mét m¶ng kÕt hîp vµo mét tÖp ®Üa (thùc tÕ lµ mét cÆp tÖp ®Üa) ®îc xem nh mét DBM. Nã ®îc dïng nh thÕ nµy:

dbmopen(%last_good, “lastdb”, 066);$last_good($name) = time;dbmclose(%last_good);C©u lÖnh ®Çu tiªn thùc hiÖn viÖc ¸nh x¹ nµy, dïng c¸c tªn

tÖp ®Üa cña lastdb.dir vµ lastdb.pag (c¸c tªn nµy lµ tªn th«ng thêng cho DBM ®îc gäi lµ lastdb). C¸c phÐp vÒ tÖp UNIX ®îc dïng cho hai tÖp nµy nÕu c¸c tÖp ®ã ph¶i ®îc t¹o ra (khi chóng lÇn ®Çu tiªn ®îc gÆp tíi) lµ 0666. Mèt nµy cã nghÜa lµ bÊt k× ai còng cã thÓ ®äc hay ghi lªn tÖp. (C¸c bit phÐp tÖp ®îc m« t¶ trong manpage chmod(2).)

C©u lÖnh thø hai chØ ra r»ng chóng ta dïng m¶ng kÕt hîp ®· ®îc ¸nh x¹ nµy hÖt nh m¶ng kÕt hîp th«ng thêng. Tuy nhiªn, viÖc t¹o ra hay cËp nhËt mét phÇn tö cña m¶ng sÏ tù ®éng cËp nhËt tÖp ®Üa t¹o nªn DBM. Vµ, khi m¶ng ®îc th©m nhËp tíi lÇn cuèi th× gi¸ trÞ bªn trong m¶ng sÏ tíi trùc tiÕp tõ h×nh ¶nh ®Üa. §iÒu nµy cho m¶ng kÕt hîp mét cuéc sèng tr¶i bªn ngoµi lêi gäi hiÖn thêi cña ch¬ng tr×nh - mét sù bÒn l©u cña riªng nã.

C©u lÖnh thø ba ng¾t m¶ng kÕt hîp ra khái DBM, gièng hÖt thao t¸c ®ãng tÖp close().

B¹n cã thÓ chÌn thªm ba c©u lÖnh nµy vµo ngay ®Çu c¸c ®Þnh nghÜa ch¬ng tr×nh con.

MÆc dÇu c¸c c©u lÖnh ®îc chÌn thªm nµy duy tr× c¬ së d÷ liÖu lµ tèt (vµ thËm chÝ cßn t¹o ra nã trong lÇn ®Çu), chóng ta vÉn kh«ng cã c¸ch nµo ®Ó xem xÐt th«ng tin trong ®ã. §Ó lµm ®iÒu ®ã, ta cã thÓ t¹o ra mét ch¬ng tr×nh nh¬ t¸ch biÖt tr«ng ®¹i thÓ nh thÕ nµy:

#!/usr/bin/perldbmopen(%last_good, “lastdb”, 0666);foreach $name (sort keys(%last_good) {

Page 38: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$when = $last_good{$name};$hours = (time - $when) / 3600; # tÝnh giê ®· quawrite;

}format STDOUT =User @<<<<<<<<<<: lÇn ®o¸n ®óng cuèi cïng lµ

@<<< giê ®· qua.$name, $hour.Chóng ta cã vµi to¸n tö míi ë ®©y: chu tr×nh foreach, s¾p

xÕp mét danh s¸ch, vµ lÊy kho¸ cña m¶ng.Tríc hÕt, to¸n tö keys() lÊy mét tªn m¶ng kÕt hîp nh mét ®èi

vµ cho l¹i mét danh s¸ch tÊt c¶ c¸c kho¸ cña m¶ng ®ã theo mét thø tù kh«ng x¸c ®Þnh nµo ®ã. (§iÒu nµy hÖt nh to¸n tö keys trong awk.) Víi m¶ng %words ®îc x¸c ®Þnh tríc ®©y, kÕt qu¶ lµ mét c¸i g× ®ã tùa nh fred, barney, betty, wilma, theo mét thø tù kh«ng x¸c ®Þnh. Víi m¶ng %last_good, kÕt qu¶ sÏ lµ mét danh s¸ch cña tÊt c¶ ngêi dïng ®· ®o¸n thµnh c«ng tõ bÝ mËt cña riªng m×nh.

To¸n tö sort s½p xÕp theo thø tù b¶ng ch÷ (hÖt nh viÖc truyÒn mét tÖp v¨n b¶n qua chØ lÖnh sort). §iÒu nµy b¶o ®¶m r»ng danh s¸ch ®îc xö lÝ bëi c©u lÖnh foreach bao giê còng theo thø tù b¶ng ch÷.

Th©n cña chu tr×nh foreach n¹p vµo hai biÕn ®îc dïng trong ®Þnh d¹ng STDOUT, vµ råi gäi tíi ®Þnh d¹ng ®ã. Chó ý r»ng chóng ta ®o¸n ra tuæi cña mét phÇn tö b»ng c¸ch trõ thêi gian UNIX ®· cÊt gi÷ (trong m¶ng) tõ thêi gian hiÖn t¹i (nh kÕt qu¶ cña time) vµ råi chia cho 3600 (®Ó chuyÓn tõ gi©y sang giê).

Perl còng cung cÊp nh÷ng c¸ch thøc dÔ dµng ®Ó t¹o ra vµ duy tr× c¸c c¬ së d÷ liÖu híng v¨n b¶n (nh tÖp mËt hiÖu) vµ c¬ së d÷ liÖu b¶n ghi chiÒu dµi cè ®Þnh (nh c¬ së d÷ liÖu “®¨ng nhËp lÇn cuèi” do ch¬ng tr×nh login duy tr×). Nh÷ng c¬ së d÷ liÖu nµy sÏ ®îc m« t¶ trong Ch¬ng 17, Thao t¸c c¬ së d÷ liÖu ngêi dïng.Ch¬ng tr×nh cuèi cïng

Sau ®©y lµ ch¬ng tr×nh mµ cuéc ®i d¹o nµy ®· ®a tíi díi d¹ng cuèi cïng ®Ó b¹n cã thÓ ch¬i víi chóng.

Tríc hÕt lµ ch¬ng tr×nh “nãi lêi chµo”:#! /usr/bin/perl&init_words;

Page 39: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

@password = getpwuid($<); # lÊy d÷ liÖu mËt hiÖu$name = $password[6]; # lÊy trêng GCOS$name =~ s/,.*//; # vøt ®i mäi thø sau dÊu phÈy ®Çu

tiªnif ($name =~ /^randal\b/i ) { # trë l¹i c¸ch kh¸c

print “Xin chµo, Randal! May qu¸ anh ë ®©y!\n”;} else {

print “Xin chµo, $name!\n”; # chµo th«ng thêngprint “Tõ bÝ mËt lµ g×?” ;$guess = <STDIN>;chop($guess);while ( ! &good_word($name, $guess)) {

print “Sai råi, thö l¹i ®i. Tõ bÝ mËt lµ g×?”;$guess = <STDIN>;chop($guess);

} }

dbmopen(%last_good, “lastdb”, 066);$last_good($name) = time;dbmclose(%last_good);sub init_words {

while ($filename = <*.secret>) {open (WORDSLIST, $filename);if (-M WORDSLIST > 7) {

while ($name = <WORDSLIST>) {chop ($name);$word = <WORDSLIST>;chop($word);$words{$name} = $word;

}}close (WORDSLIST);

}}sub good_word {

local($somename, $someguess) = @_; # tªn tham biÕn$somename =~ s/\W.*//; # bá mäi thø sau tõ ®Çu$somename =~ tr/A-Z/a-z/; # mäi thø thµnh ch÷ thêngif ($somename eq “randal”) { # kh«ng nªn ®o¸n

1; #gi¸ trÞ cho l¹i lµ true} elsif (($words{$somename} || “®å c¸u kØnh”) eq

Page 40: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$someguess) {1; # gi¸ trÞ cho l¹i lµ true

} else {open(MAIL, “|mail §Þa_chØ_b¹n_ë_®©y”);

print MAIL “tin xÊu: $somename ®· ®o¸n $someguess\n”;

0; # cho l¹i gi¸ trÞ false}

}TiÕp ®ã, ta cã bé in tõ bÝ mËt:#! /usr/bin/perlwhile ($filename = <*.secret>) {

open (WORDSLIST, $filename);if (-M WORDSLIST > 7) {

while ($name = <WORDSLIST>) {chop ($name);$word = <WORDSLIST>;chop($word);write; # gäi ®Þnh d¹ng STDOUT cho STDOUT

}}close(WORDSLIST);

}format STDOUT = @<<<<<<<<<<<<<<< @<<<<<<<<<<

@<<<<<<<<<<<<<<$filename, $name, $word.format STDOUT_TOP =Page @<<$%

Tªn tÖp Tªn Tõ========== ======== ==========.Vµ cuèi cïng, lµ ch¬ng tr×nh hiÓn thÞ tõ ®· ®îc dïng lÇn

cuèi cïng:#!/usr/bin/perldbmopen(%last_good, “lastdb”, 0666);foreach $name (sort keys(%last_good) {

$when = $last_good{$name};

Page 41: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$hours = (time - $when) / 3600; # tÝnh giê ®· quawrite;

}format STDOUT =User @<<<<<<<<<<: lÇn ®o¸n ®óng cuèi cïng lµ

@<<< giê ®· qua.$name, $hour.Cïng víi danh s¸ch tõ bÝ mËt (c¸c tÖp cã tªn

something.secret trong danh môc hiÖn t¹i) vµ c¬ së d÷ liÖu lastdb.dir vµ lastdb.pag, b¹n ®· cã tÊt c¶ nh÷ng g× m×nh cÇn.Bµi tËp

Th«ng thêng, mçi ch¬ng sÏ kÕt thóc víi mét sè bµi tËp, lêi gi¶i cho chóng sÏ cã trong Phô lôc A, Tr¶ lêi bµi tËp. Víi chuyÕn ®i d¹o nµy, lêi gi¶i ®· ®îc cho ë trªn.1. H·y gâ trong ch¬ng tr×nh thÝ dô trªn vµo m¸y råi cho nã

ch¹y. (B¹n cÇn t¹o ra danh s¸ch tõ bÝ mËt n÷a.) H·y hái thÇy Perl cña m×nh nÕu b¹n cÇn trî gióp.

Page 42: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

2

D÷ liÖu

v« híng

D÷ liÖu v« híng lµ g×?V« híng lµ lo¹i d÷ liÖu ®¬n gi¶n nhÊt mµ Perl thao t¸c. Mét

v« híng th× hoÆc lµ mét sè (gièng 4 hay 3.25e20) hay mét x©u c¸c kÝ tù (gièng Xin chµo hay Gettysburg Address). MÆc dÇu b¹n cã thÓ nghÜ vÒ sè vµ x©u nh nh÷ng vËt rÊt kh¸c nhau, Perl dïng chóng gÇn nh ®æi lÉn cho nhau, cho nªn t«i sÏ m« t¶ chóng víi nhau.

Mét gi¸ trÞ v« híng cã thÓ ®îc t¸c ®éng tíi qua c¸c to¸n tö (gièng nh phÐp céng hay ghÐp tiÕp), nãi chung cho l¹i mét kÕt qu¶ v« híng. Mét gi¸ trÞ v« híng cã thÓ ®îc cÊt gi÷ vµo trong mét biÕn v« híng. C¸c v« híng cã thÓ ®îc ®äc tõ tÖp vµ thiÕt bÞ, vµ ®îc ghi ra n÷a.Sè

MÆc dÇu v« híng th× hoÆc lµ mét sè hay mét x©u, ®iÒu còng cã Ých lµ nh×n vµo c¸c sè vµ x©u t¸ch biÖt nhau trong mét chèc. ta sÏ xÐt sè tríc råi ®Õn x©u...TÊt c¶ c¸c sè ®Òu cã cïng ®Þnh d¹ng bªn trong

Nh b¹n sÏ thÊy trong vµi ®o¹n tiÕp ®©y, b¹n cã thÓ x¸c ®Þnh c¶ sè nguyªn (toµn bé sè, gièng nh 14 hay 342) vµ sè dÊu phÈy ®éng (sè thùc víi dÊuchÊm thËp ph©n, nh 3.14, hay 1.35 lÇn 1025). Nhng bªn trong, Perl chØ tÝnh víi c¸c gi¸ trÞ dÊu phÈy ®éng ®é chÝnh x¸c gÊp ®«i. §iÒu nµy cã nghÜa lµ kh«ng cã gi¸ trÞ nguyªn bªn trong Perl - mét h»ng nguyªn trong ch¬ng tr×nh ®îc xö lÝ nh gi¸ trÞ dÊu phÈy ®éng t¬ng ®¬ng. B¹n cã lÏ kh«ng ®Ó ý ®Õn viÖc chuyÓn ®æi (hay quan t©m nhiÒu), nh-ng b¹n nªn dõng t×m kiÕm phÐp to¸n nguyªn (xem nh ngîc víi c¸c phÐp to¸n dÊu phÈy ®éng), v× kh«ng cã tÑo nµo.

Trong ch¬ng nµy: 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> xem nh

gi¸ trÞ v« híng In ra víi print() Gi¸ trÞ undef

Page 43: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

H»ng kÝ hiÖu ®éngH»ng kÝ hiÖu lµ mét c¸ch ®Ó biÓu diÔn mét gi¸ trÞ trong

v¨n b¶n ch¬ng tr×nh Perl - b¹n còng cã thÓ gäi ®iÒu nµy lµ mét h»ng trong ch¬ng tr×nh m×nh, nhng t«i sÏ dïng thuËt ng÷ h»ng kÝ hiÖu. H»ng kÝ hiÖu lµ c¸ch thøc biÓu diÔn d÷ liÖu trong m· ch¬ng tr×nh gèc cña ch¬ng tr×nh b¹n nh c¸i vµo cho tr×nh biªn dÞch Perl. (D÷ liÖu ®îc ®äc tõ hay ghi lªn c¸c tÖp ®Òu ®îc xö lÝ t¬ng tù, nhng kh«ng ®ång nhÊt.)

Perl chÊp nhËn tËp hîp ®Çy®ñ c¸c h»ng kÝ hiÖu dÊu phÈy ®éng cã s½n cho ngêi lËp tr×nh C. Sè cã hay kh«ng cã dÊu chÊm thËp ph©n ®Òu ®îc phÐp (kÓ c¶ tiÒn tè céng hay trõ tuú chän), còng nh phÇn chØ sè mò phô thªm (kÝ ph¸p luü thõa) víi c¸ch viÕt E. Ch¼ng h¹n:

1.25 # mét phÇn t7.25e45 # 7.25 lÇn 10 mò 45 (mét sè lín)-6.5e24 # ©m 6.5 lÇn 10 mò 24 (mét sè ©m lín)-12e-24 # ©m 12 lÇn 10 mò -24 (mét sè ©m rÊt

nhá)-1.2E-23 # mét c¸ch kh¸c ®Ó nãi ®iÒu ®ã.

H»ng kÝ hiÖu nguyªnC¸c h»ng kÝ hiªu jnguyªn còng lµ trùc tiÕp, nh trong:1215-20043485B¹n ®õng b¾t ®Çu mét sè b»ng 0, v× Perl hç trî cho h»ng

kÝ hiÖu hÖ t¸m vµ hÖ mêi s¸u (hÖt nh kiÓu C). Sè hÖ t¸m b¾t ®Çu b»ng sè 0 ®øng ®Çu, cßn sè hÖ mêi s¸u th× b¾t ®Çu b»ng 0x hay 0X* . C¸c ch÷ sè hÖ mêi s¸u A ®Õn F (trong c¶ hai kiÓu ch÷ hoa thêng) ®Òu biÓu thÞ cho c¸c gi¸ trÞ sè qui íc tõ 10 ®Õn 15. Ch¼ng h¹n:

0377 # 377 hÖ t¸m, gièng nh 255 thËp ph©n-0xff # FF hÖ mêi s¸u ©m, hÖt nh -255 thËp ph©n

X©uX©u lµ c¸c dÉy kÝ tù (nh Xin chµo). Mçi kÝ tù ®Òu lµ mét

gi¸ trÞ 8-bit trong toµn bé t©kp 256 kÝ tù (kh«ng cã g× ®Æc * ChØ b¸o “sè kh«ng ®øng ®Çu” chØ cã t¸c dông víi c¸c h»ng kÝ hiÖu - kh«ng cã t¸c dông cho viÖc chuyÓn ®æi tù ®éng x©u sang sè. b¹n cã thÓ chuyÓn ®æi mét x©u d÷ liÖu gièng nh mét gi¸ trÞ hÖ t¸m vµ hÖ mêi s¸u thµnh mét sè víi oct() hay hex().

Page 44: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

biÖt vÒ kÝ tù NUL nh trong C).X©u ng¾n nhÊt cã thÓ ®îc th× kh«ng cã kÝ tù nµo. X©u dµi

nhÊt th× chiÕm trän bé nhí cña b¹n (mÆc dÇu b¹n sÏ ch¼ng thÓ nµo lµm g× nhiÒu víi nã c¶). §iÒu nµy phï hîp víi nguyªn lÝ “kh«ng cã giíi h¹n s½n g×” mµ Perl cho phÐp mäi c¬ héi. C¸c x©u ®iÓn h×nh lµ c¸c dÉy in ®îc gåm c¸c ch÷ vµ sè vµ dÊu ng¾t trong ph¹m vi ASCII 32 tíi ASCII 126. Tuy nhiªn, kh¶ n¨ng ®Ó cã bÊt k× kÝ tù nµo tõ 0 tíi 255 trong mét x©u cã nghÜa lµ b¹n cã thÓ t¹o ra, nhßm qua, vµ thao t¸c d÷ liÖu nhÞ ph©n th« nh c¸c x©u - mét c¸i g× ®ã mµ phÇn lín c¸c tr×nh tiÖn Ých UNIX kh¸c sÏ gÆp khã kh¨n lín. (Ch¼ng h¹n, b¹n cã thÓ v¸ vÝu lâi UNIX b»ng viÖc ®äc nã vµo trong x©u Perl, tiÕn hµnh thay ®æi, vµ ghi kÕt qu¶ l¹i.)

Gièng nh sè, x©u cã biÓu diÔn h»ng kÝ hiÖu (c¸ch thøc b¹n biÓu diÔn x©u trong ch¬ng tr×nh Perl). C¸c x©u h»ng kÝ hiÖu cã theo hai h¬ng vÞ: x©u dÊu nh¸y ®¬n vµ x©u dÊu nh¸y kÐp.

X©u dÊu nh¸y ®¬nX©u dÊu nh¸y ®¬n lµ mét dÉy c¸c kÝ tù ®îc bao trong dÊu

nh¸y ®¬n. DÊu nh¸y ®¬n kh«ng ph¶i lµ mét phÇn cña b¶n th©n x©u - chóng chØ cã ®ã ®Ó Perl x¸c ®Þnh chç b¾t ®Çu vµ kÕt thóc cña x©u. BÊt k× kÝ tù nµo n»m gi÷a c¸c dÊu nh¸y (kÓ c¶ dÊu dßng míi, nÕu x©u vÉn cßn tiÕp tôc sang dßng sau) ®Òu lµ hîp ph¸p bªn trong x©u. Hai biÖt lÖ: ®Ó lÊy ®îc mét dÊu nh¸y ®¬n trong mét x©u cã nh¸y ®¬n, b¹n h·y ®Æt tríc nã mét dÊu sæ chÐo ngîc. Vµ ®Ó lÊy ®îc dÊu sæ chÐo ngîc trong mét x©u cã nh¸y ®¬n, b¹n h·y ®Æt tríc dÊu sæ chÐo ng-îc nét dÊu sæ chÐo ngîc n÷a. Díi d¹ng h×nh ¶nh:

‘hello’ # n¨m kÝ tù: h, e, l, l, o‘dont\’t’ # n¨m kÝ tù: d, o, n, nh¸y ®¬n, t‘’ # x©u kh«ng (kh«ng kÝ tù)‘silly\\me’ # silly, theo sau lµ mét sæ chÐo ngîc, sau lµ

me‘hello\n’ # hello theo sau lµ sæ chÐo ngîc vµ n‘hellothere’ # hello, dßng míi, there (toµn bé 11 kÝ tù)Chó ý r»ng \n bªn trong m«t jx©u cã nh¸y ®¬n th× kh«ng

®îc hiÓu lµ dßng míi, nhng lµ hai kÝ tù sæ chÐo ngîc vµ n. (ChØ khi sæ chÐo ngîc ®i theo sau bëi mét sæ chÐo ngîc kh¸c hay mét dÊu nh¸y ®¬n th× míi mang nghÜa ®Æc biÖt.)

Page 45: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

X©u dÊu nh¸y kÐpX©u dÊu nh¸y kÐp hµnh ®éng hÖt nh x©u trong C. Mét lÇn

n÷a, nã l¹i lµ d·y c¸c kÝ tù, mÆc dÇu lÇn nµy ®îc bao bëi dÊu ngoÆc kÐp. Nhng b©y giê dÊu sæ chÐo ngîc lÊy toµn bé søc m¹nh cña nã ®Ó x¸c ®Þnh c¸c kÝ tù ®iÒu khiÓn nµo ®ã, hay thËm chÝ bÊt k× kÝ tù nµo qua c¸c biÓu diÔn hÖ t¸m hay hÖ mêi s¸u. §©y lµ mét sè x©u dÊu nh¸y kÐp:

“hello world\n” # hello world, vµ dßng míi“new \177” # new, dÊu c¸ch vµ kÝ tù xo¸ (177 hÖ t¸m)“coke\tsprite” # coke, dÊu tab, vµ spriteDÊu sæ chÐo cã thÓ ®øng tríc nhiÒu kÝ tù kh¸c nhau ®Ó

hµm ý nh÷ng ®iÒu kh¸c nhau (vÒ ®iÓn h×nh nã ®îc gäi lµ lèi tho¸t sæ chÐo). Danh s¸ch ®Çy ®ñ cña c¸c lèi tho¸t x©u nh¸y kÐp ®îc cho trong B¶ng 2-1.

B¶ng 2-1 Lèi tho¸t sæ chÐo ngîc x©u nh¸y kÐpKÕt cÊu

ý nghÜa

\n dßng míi\r quay l¹i\t Tab\f kÐo giÊy\b Backspace\v tab chiÒu ®øng\a chu«ng\e lèi tho¸t\007 bÊt k× gi¸ trÞ ASCII hÖ t¸m

(ë ®©y, 007 = chu«ng)\x7f gi¸ trÞ ASCII hÖ mêi s¸u (ë

®©y, 7f = xo¸)\cC bÊt k× kÝ tù “®iÒu khiÓn”

nµo (ë ®©y, control C)\\ sæ chÐo ngîc\” dÊu nh¸y kÐp\l ch÷ tiÕp lµ ch÷ thêng\L tÊt c¶ c¸c ch÷ ®i sau cho tíi \

E ®Òu lµ ch÷ thêng

Page 46: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

\u Ch÷ tiÕp lµ ch÷ hoa\U tÊt c¶ c¸c ch÷ ®i sau cho tíi \

E ®Òu lµ ch÷ hoa\E KÕt thóc \L hay \U

Mét tÝnh n¨ng kh¸c cña x©u nh¸y kÐp lµ ë chç chóng cho phÐp chen lÉn c¸c biÕn, nghÜa lµ mét sè tªn biÕn nµo ®ã bªn trong x©u ®îc thay thÕ bëi gi¸ trÞ hiÖn t¹i cña chóng khi x©u ®îc dïng. Chóng ta ®· kh«ng ®îc giíi thiÖu mét c¸ch chÝnh thøc lµ c¸c biÕn tr«ng nh thÕ nµo (ngo¹i trõ trong cuéc ®i d¹o), cho nªn t«i sÏ quay l¹i vÊn ®Ò nµy sau.To¸n tö

Mét to¸n tö t¹o ra mét gi¸ trÞ míi (kÕt qu¶) tõ mét hay nhiÒu gi¸ trÞ kh¸c (c¸c to¸n h¹ng). Ch¼ng h¹n, + lµ mét to¸n tö v× nã nhËn hai sè (to¸n h¹ng, nh 5 vµ 6), vµ t¹o ra mét gi¸ trÞ míi (11, kÕt qu¶).

C¸c to¸n tö vµ biÓu thøc cña Perl nsoi chung ®Òu lµ siªu tËp cña c¸c to¸n tö ®· cã trong hÇu hÕt c¸c ng«n ng÷ lËp tr×nh tùa ALGOL/Pascal, nh C. Mét to¸n tö bao giê còng tr«ng ®îi c¸c to¸n h¹ng sè hay x©u (hay cã thÓ lµ tæ hîp cña c¶ hai). NÕu b¹n cung cÊp mét to¸n h¹ng x©u ë chç ®ang cÇn tíi mét sè, hay ng-îc l¹i, th× Perl sÏ tù ®éng chuyÓn to¸n h¹ng ®ã b»ng viÖc dïng c¸c qui t¾c kh¸ trùc gi¸c, mµ sÏ ®îc nªu chi tiÕt trong môc “ChuyÓn ®æi gi÷a sè vµ x©u,” díi ®©y.To¸n tö cho sè

Perl cung cÊp c¸c to¸n tö céng, trõ, nh©n, chia ®iÓn h×nh th«ng thêng, v©n v©n. Ch¼ng h¹n:

2 + 3 # 2 céng 3, hay 55.1 - 2.4 # 5.1 trõ ®i 2.4, hay 2.73 * 12 # 3 lÇn 12 = 3614 / 2 # 14 chia cho 2, hay 710.2 / 0.3 # 10.2 chia cho 0.3, hay 3410 / 3 # bao giê lµ phÐp chia dÊu phÈy ®éng, nªn

3.333...Bªn c¹nh ®ã, Perl cung cÊp to¸n tö lòy thõa kiÓu FORTRAN,

mµ nhiÒu ngêi ®· tõng mong mái cho Pascal vµ C. To¸n tö nµy ®îc biÓu diÔn b»ng hai dÊu sao, nh 2**3, chÝnh lµ hai luü thõa ba, hay t¸m. (NÕu kÕt qu¶ kh«ng thÓ khíp trong sè dÊu phÈy

Page 47: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

®éng ®é chÝnh x¸c gÊp ®«i, nh mét sè ©m mµ l¹i luü thõa theo sè kh«ng nguyªn, hay mét sè lín lÊy luü thõa theo sè lín, th× b¹n sÏ nhËn ®îc lçi ®Þnh mÖnh.)

Perl còng hç trî cho to¸n tö lÊy ®ång d modulus, nh trong C. Gi¸ trÞ cña biÓu thøc 10 % 3 lµ sè d khi lÊy mêi chia cho ba, chÝnh lµ mét. C¶ hai gi¸ trÞ ®Òu tríc hÕt ®îc ®a vÒ gi¸ trÞ nguyªn, cho nªn 10.5 % 3.2 ®îc tÝnh lµ 10 % 3.

C¸c to¸n tö so s¸nh logic lµ hÖt nh c¸c to¸n tö cã trong C (< <= == >= > !=), vµ viÖc so s¸nh hai gi¸ trÞ vÒ mÆt sè sÏ cho l¹i mét gi¸ trÞ ®óng hay sai. Ch¼ng h¹n, 3 . 2 cho l¹i ®óng v× ba lín h¬n hai, trong khi 5 != 5 cho l¹i sai v× kh«ng ®óng lµ n¨m l¹i kh«ng b»ng n¨m. C¸c ®Þnh nghÜa vÒ ®óng vµ sai ®îc nãi tíi vÒ sau, nhng víi hiÖn t¹i, c¸c b¹n h·y nghÜ vÒ gi¸ trÞ cho l¹i gièng nh chóng ë trong C - mét lµ ®óng, cßn kh«ng lµ sai. (C¸c to¸n tö nµy sÏ ®wojc th¨m l¹i trong B¶ng 2-2.)To¸n tö x©u

C¸c gi¸ trÞ x©u cã thÓ ®îc ghÐp víi to¸n tö chÊm (.). (Qu¶ thÕ, ®ã lµ dÊu chÊm ®¬n.) §iÒu nµy kh«ng lµm thay ®æi x©u, còng nh 2+3 kh«ng lµm thay ®æi 2 hay 3. X©u kÕt qu¶ (dµi h¬n) vËy lµ cã s½n cho tÝnh to¸n thªm hay ®îc cÊt gi÷ trong mét biÕn.

“hello” . “world” # hÖt nh “helloworld”‘hello wordl’ . “\n” # hÖt nh “hello world\n”“fred” . “ “ . “barney” # hÖt nh “fred barney”Chó ý r»ng viÖc ghÐp nèi ph¶i ®îc gäi têng minh tíi to¸n tö .,

kh«ng gièng awk mµ b¹n ®¬n thuÇn ph¶i ®¸nh dÊu hai gi¸ trÞ gÇn lÉn nhau.

Mét tËp c¸c to¸n tö cho x©u kh¸c lµ to¸n tö so s¸nh x©u. C¸c to¸n tö nµy ®Òu tùa FORTRAN, nh lt thay cho bÐ h¬n, v©n v©n. C¸c to¸n tö so s¸nh c¸c gi¸ trÞ ASCII cña c¸c kÝ tù cña x©u theo c¸ch th«ng thêng. TËp ®Çy ®ñ c¸c to¸n tö so s¸nh (cho c¶ sè vµ x©u) ®îc nªu trong B¶ng 2-2.

B¶ng 2-2. C¸c to¸n tö so s¸nh sè vµ x©uPhÐp so s¸nh Sè X©u

B»ng == eqKh«ng b»ng != neBÐ h¬n < ltLín h¬n > gt

Page 48: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

BÐ h¬n hay b»ng <= leLín h¬n hay b»ng >= ge

B¹n cã thÓ tù hái t¹i sao l¹i cã c¸c to¸n tö ph©n t¸ch cho sè vµ x©u vËy, nÕu sè vµ x©u ®îc tù ®éng chuyÓn ®æi lÉn cho nhau. ta h·y xÐt hai gi¸ trÞ 7 vµ 30. NÕu ®îc so s¸nh nh sè th× 7 hiÓn nhiªn bÐ h¬n 30, nhng nÕu ®îc so s¸nh theo x©u, th× x©u “30” sÏ ®øng tríc x©u “7” (v× gi¸ trÞ ASCII cña 3 th× bÐ h¬n gi¸ trÞ ASCII cña 7), vµ do ®ã lµ bÐ h¬n. Cho nªn, kh«ng gièng awk, Perl ®ßi hái b¹n x¸c ®Þnh ®óng kiÓu so s¸nh, liÖu ®ã lµ sè hay x©u.

Chó ý r»ng c¸c phÐp so s¸nh sè vµ x©u vÒ ®¹i thÓ ngîc víi nh÷ng ®iÒu xÈy ra cho chØ lÖnh test cña UNIX, mµ thêng dïng kÝ hiÖu -eq ®Ó so s¸nh sè cßn = ®Ó so s¸nh x©u.

VÉn cßn mét to¸n tö x©u kh¸c lµ to¸n tö lÆp l¹i x©u, bao gåm mét kÝ tù chø thêng ®¬n gi¶n x. To¸n tö nµy lÊy to¸n h¹ng tr¸i cña nã (mét x©u), vµ thùc hiÖn nhiÒu viÖc ghÐp b¶n sao cña x©u ®ã theo sè lÇn do to¸n h¹ng bªn ph¶i chØ ra (mét sè). Ch¼ng h¹n:

“fred” x 3 # lµ “fredfredfred” “barney” x (4+1)# lµ “barney” x 5 hay#“barneybarneybarneybarneybarney”(3+2) x 4 # lµ 5 x 4, hay thùc sù “5” x 4, lµ

“5555”ThÝ dô cuèi cïng ®¸ng ®Ó xem xÐt chËm r·i. C¸c dÊu ngoÆc

trªn (3+2) buéc cho phµn nµy cña biÓu thøc cÇn ph¶i ®îc tÝnh tríc, cho n¨m. (C¸c dÊu ngoÆc ë ®©y lµm viÖc gièng nh trong C, hay trong to¸n häc chuÈn.) Nhng to¸n tö lÆp l¹i x©u cÇn mét x©u cho to¸n h¹ng bªn tr¸i, cho nªn sè 5 ®îc chuyÓn thµnh x©u “5” (dïng c¸c qui t¾c sÏ ®îc m« t¶ chi tiÕt vÒ sau), thµnh x©u mét kÝ tù. X©u míi nµy råi ®îc sao lªn bèn lÇn, cho x©u bèn kÝ tù 5555. Chó ý r»ng nÕu ta ®¶o ngîc trËt tù c¸c to¸n h¹ng, th× tssa sÏ lµm n¨m b¶n sao cña x©u 4, cho 44444. §iÒu nµy chØ ra r»ng viÖc lÆp l¹i x©u lµ kh«ng giao ho¸n.

Sè ®Õm b¶n sao (to¸n h¹ng bªn ph¶i) tríc hÕt sÏ bÞ chÆt côt ®i ®Ó cho gi¸ trÞ nguyªn (4.8 trë thµnh 4) tríc khi ®îc sö dông. Sè ®Õm b¶n sao bÐ h¬n mét sÏ g©y ra kÕt qu¶ lµ x©u rçng (chiÒu dµi kh«ng).

Page 49: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Thø tù u tiªn vµ luËt kÕt hîp cña to¸n töThø tù u tiªn cña to¸n tö x¸c ®Þnh ra c¸ch gi¶i quyÕt trêng

hîp kh«ng râ rµng khi nµo dïng to¸n tö nµo trªn ba to¸n h¹ng. Ch¼ng h¹n, trong biÓu thøc 2+3*4, ta sÏ thùc hiÖn phÐp céng tríc hay phÐp nh©n tríc? NÕu ta lµm phÐp céng tríc th× ta sÏ ®îc 5*4, hay 20. Nhng nÕu ta lµm phÐp nh©n tríc (nh ta vÉn ®îc dËy trong giê to¸n) th× ta ®îc 2+12, hay 14. May m¾n lµ Perl chän ®Þnh nghÜa to¸n häc th«ng thêng, thùc hiÖn nh©n tríc. Bëi ffiÒu nµy, ta nãi nh©n cã sè u tiªn cao h¬n céng.

B¹n cã thÓ ph¸ rµo trËt tù theo sè u tiªn b»ng viÖc dïng dÊu ngoÆc. BÊt k× c¸i g× trong dÊu ngoÆc ®Òu ®îc tÝnh hÕt tríc khi to¸n tö bªn ngoµi dÊu ngoÆc ®îc ¸p dông (hÖt nh b¹n ®· häc trong giê to¸n). Cho nªn nÕu t«i thùc sù muèn céng tríc khi nh©n, th× t«i cã thÓ viÕt (2+3)*4, cho 20. Còng vËy, nÕu t«i muèn biÓu thÞ r»ng phÐp nh©n ®îc thùc hiÖn tríc phÐp céng, t«i cã thÓ trang ®iÓm thªm nhng ch¼ng ®Ó lµm g×, mét cÆp dÊu ngoÆc trong 2+(3*4).

Trong khi sè u tiªn lµ trùc gi¸c cho phÐp céng vµ nh©n th× ta b¾t ®Çu lao vµo vÊn ®Ò thêng hay ph¶i ®¬ng ®Çu víi, ch¼ng h¹n, ph©n biÖt thÕ nµo ®èi víi phÐp ghÐp x©u vµ n©ng lªn luü thõa. C¸c ®óng ®¾n ®Ó gi¶i quyÕt ®iÒu nµy lµ tra cøu s¬ ®å sè thø tù u tiªn to¸n tö cña Perl, ®îc nªu trong B¶ng 2-3. (Chó ý r»ng mét sè c¸c to¸n tö cßn cha ®îc m« t¶, vµ trong thùc tÕ, thËm chÝ kh«ng thÓ xuÊt hiÖn ë bÊt k× ®©u trong cuèn s¸ch nµy, nhng chí cã lµm ®iÒu ®ã lµm b¹n ho¶ng sî vÒ viÖc ®äc chóng.) Víi nh÷ng to¸n tö còng cã trong C, th× nh÷ng to¸n tö ®ã cã cïng são thø tù u tiªn nh chóng cã trong C (mµ t«i cã thÓ ch¼ng bao giê nhí ®îc).

B¶ng 2-3: LuËt kÕt hîp vµ sè u tiªn cña c¸c to¸n tö (thÊp nhÊt ®Õn cao nhÊt)

LuËt kÕt hîp

To¸n tö

kh«ng To¸n tö “danh s¸ch”tr¸i , (phÈy)ph¶i += vµ c¸c to¸n tö kh¸c

(to¸n tö “g¸n”)ph¶i ? : (to¸n tö if/then/else ba

ng«i)kh«ng .. (to¸n tö ph¹m vi, cÊu tö

Page 50: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

danh s¸ch)tr¸i || (hoÆc logic)tr¸i && (vµ logic)tr¸i | ^ (hoÆc bit, hoÆc bit

lo¹i trõ)tr¸i & (vµ bit)kh«ng == != <=> eq ne cmp

(to¸n tö “b»ng”)kh«ng < <= > >= lt le gt ge

(to¸n tö “kh«ng b»ng”)kh«ng To¸n tö mét ng«i cã tªnkh«ng -r vµ (c¸c to¸n tö kiÓm tra

tÖp)* kh¸ctr¸i << >> (dÞch chuyÓn

bit)tr¸i + - . (céng, trõ, ghÐp

x©u)tr¸i * / % x (nh©n, chia, lÊy

d, lÆp x©u)tr¸i =~ !~ (s¸nh, kh«ng

s¸nh)ph¶i ** (luü thõa)ph¶i ! ~ - (phñ ®Þnh logic,

phñ ®Þnh bit, phñ ®Þnh sè)

kh«ng ++ -- (tù t¨ng, tù gi¶m)

Trong s¬ ®å nµy, bÊt k× to¸n tö ®· cho nµo ®Òu cã sè u tiªn lín h¬n c¸c to¸n tö ®îc liÖt kª trªn nã, vµ cã sè u tiªn thÊp h¬n c¸c to¸n tö ®îc liÖt kª díi nã. (§iÒu nµy dùng ngîc l¹i ®iÒu cã lÏ b¹n ®ang tr«ng ®îi, nhng nã hÖt nh trong s¸ch con lõa, vµ chóng t«i còng ®· dùng ngîc nã xuèng ë ®ã n÷a.) C¸c to¸n tö t¹i cïng møc u tiªn ®îc gi¶i quyÕt theo luËt kÕt hîp.

Gièng nh víi sè u tiªn, luËt kÕt hîp gi¶i quyÕt trËt tù cña c¸c phÐp to¸n khi hai to¸n tö cã cïng møc u tiªn cïng t¸c ®éng trªn * Perl 5.0 tæ hîp c¸c to¸n tö kiÓm tra tÖp vµ to¸n tö mét ng«i cã tªn vµo cïng møc sè u tiªn

Page 51: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

ba to¸n h¹ng:2 ** 3 ** 4 # 2 ** (3 ** 4), hay 2 ** 81, hay xÊp xØ

2.41e2472 / 12 / 3 # (72 / 12) / 3, hay 6 / 3, hay 230 / 6 * 3 # (30/6)*3, hay 15Trong trêng hîp thø nhÊt, to¸n tö ** cã luËt kÕt hîp ph¶i, cho

nªn c¸c dÊu ngoÆc ®îc ¸p dông tõ bªn ph¶i. So s¸nh víi nã, c¸c to¸n tö * vµ / cã luËt kÕt hîp tr¸i, cho tËp c¸c dÊu ngoÆc bªn tr¸i.ChuyÓn ®æi gi÷a sè vµ x©u

NÕu mét gi¸ trÞ x©u ®îc dïng nh mét to¸n h¹ng cho mét to¸n tö sè (ch¼ng h¹n, +), th× Perl sÏ tù ®éng chuyÓn x©u thµnh gi¸ trÞ sè t¬ng ®¬ng, dêng nh nã ®· ®îc ®a vµo nh mét gi¸ trÞ dÊu phÈy ®éng* . Nh÷ng chÊt liÖu phi sè ®»ng ®u«i vµ kho¶ng tr¾ng ®»ng ®Çu ®Òu bÞ bá qua mét c¸ch yªn lÆng vµ lÔ phÐp, cho nªn “ 123.45fred” (víi dÊu c¸ch ®øng tríc) chuyÓn thµnh 123.45 víi lêi c¶nh b¸o* . T¹i mét cùc ®iÓm cña ®iÒu nµy, mét c¸i g× ®ã kh«ng ph¶i lµ sè tÑo nµo chuyÓn thµnh kh«ng mµ kh«ng cã b¸o tríc (nh x©u fred ®îc dïng nhsè).

Gièng vËy, nÕu mét gi¸ trÞ sè ®îc cho khi ®ang cÇn tíi mét gi¸ trÞ x©u (cho phÐp ghÐp x©u ch¼ng h¹n), th× gi¸ trÞ sè sÏ ®îc më réng thµnh bÊt k× x©u nµo sÏ ®îc in ra cho sè ®ã. Ch¼ng h¹n, nÕu b¹n muèn ghÐp nèi X vµ theo sau lµ kÕt qu¶ cña 4 nh©n víi 5 th× b¹n cã thÓ lµm ®¬n gi¶n lµ:

“X”.(4*5) # hÖt nh “X”.20, hay “X20”(Nhí r»ng c¸c dÊu ngoÆc nµy buéc 4*5 ph¶i ®îc tÝnh tríc khi

xem xÐt to¸n tö ghÐp nèi x©u.)Nãi c¸ch kh¸c, b¹n kh«ng thùc sù ph¶i lo l¾ng g× vÒ liÖu b¹n

cã mét sè hay mét x©u (phÇn lín thêi gian). Perl thùc hiÖn mäi chuyÓn ®æi cho b¹n.BiÕn v« híng

Mét biÕn lµ mét tªn gäi cho mét chç chøa gi÷ ®îc mét hay nhiÒu gi¸ trÞ. Tªn cña biÕn lµ kh«ng ®æi trong toµn bé ch¬ng tr×nh, nhng gi¸ trÞ hay c¸c gi¸ trÞ ®îc chøa trong biÕn ®ã vÒ c¬ b¶n th× l¹i thay ®æi ®i thay ®æi l¹i trong suèt sù thùc hiÖn ch¬ng tr×nh.* C¸c gi¸ trÞ hÖ t¸m vµ hÖ mêi s¸u kh«ng ®îc hç trî trong chuyÓn ®æi tù ®éng nµy. B¹n h·y dïng hex() vµ oct() ®Ó diÔn gi¶i c¸c gi¸ trÞ hÖ mêi s¸u vµ t¸m.* Trõ phi b¹n bËt tuú chän -w trªn dßng lÖnh

Page 52: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Mét biÕn v« híng th× gi÷ mét gi¸ trÞ v« híng riªng (biÓu thÞ cho mét sè, hay mét x©u, hay c¶ hai). C¸c tªn biÕn v« híng b¾t ®Çu víi dÊu ®« la vµ tiÕp theo sau lµ mét ch÷, råi th× cã thÓ lµ nhiÒu ch÷, sè hay dÊu g¹ch thÊp. Ch÷ hoa vµ ch÷ thêng lµ ph©n biÖt: biÕn $A lµ kh¸c biÕn $a. Vµ tÊt c¶ c¸c ch÷, sè vµ g¹ch thÊp ®Òu cã nghÜa, cho nªn:

$a_very_long_variable_that_ends_in_1lµ kh¸c víi $a_very_long_variable_that_ends_in_2B¹n nãi chung nªn chän tªn biÕn mang mét nghÜa nµo ®ã

cã liªn quan tíi gi¸ trÞ cña biÕn ®ã. Ch¼ng h¹n, $xyz123 cã lÏ kh«ng mang tÝnh m« t¶ nhiÒu l¾m nhng $line_length th× l¹i cã nghÜa.C¸c to¸n tö trªn biÕn v« híng

PhÐp to¸n th«ng dông nhÊt trªn biÕn v« híng lµ phÐp g¸n, chÝnh lµ c¸ch ®Æt mét gi¸ trÞ cho mét biÕn. To¸n tö g¸n cña Perl lµ dÊu b»ng (gièng nh C hay FORTRAN), ®Ó tªn biÕn bªn vÕ tr¸i vµ cho gi¸ trÞ cña biÓu thøc bªn vÕ ph¶i, kiÓu nh:

$a = 17; # cho $a gi¸ trÞ 17$b = $a + 3; # cho $b gi¸ trÞ hiÖn t¹i cña $a céng víi

3 (20)$b = $b * 2; # cho $b gi¸ trÞ cña $b ®îc nh©n víi 2 (40)Chó ý r»ng dßng cuèi dïng biÕn $b hai lÇn: khi lÊy ®îc gi¸ trÞ

cña nã (ë vÕ ph¶i dÊu =), vµ khi x¸c ®Þnh xem ph¶i ®Æt biÓu thøc tÝnh ®îc vµo ®©u (ë vÕ tr¸i cña dÊu =). §iÒu nµy lµ hîp lÖ, an toµn vµ trong thùc tÕ, kh¸ th«ng dông. Trong thùc tÕ, nã th«ng dông ®Õn møc chóng ta sÏ thÊy trong vµi phót ®©y lµ ta cã thÓ viÕt ®iÒu nµy b»ng viÖc dïng c¸ch viÕt t¾t qui íc.

B¹n cã thÓ ®· chó ý r»ng c¸c biÕn v« híng bao giê còng ®îc tham kh¶o b»ng dÊu $ ®øng tríc. Trong líp vá, b¹n dïng $ ®Ó lÊy mét gi¸ trÞ, nhng ®Ó $ ®øng mét m×nh ®Ó g¸n mét gi¸ trÞ míi. Trong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NÕu b¹n cø ph¶i viÕt ®i viÕt l¹i c¸c biÕn rÊt nhiÒu th× b¹n sÏ thÊy m×nh ngÉu nhiªn bÞ gâ sai. Thêng hay bÞ vËy. (Gi¶i ph¸p cña t«i lµ chÊm døt viÖc viÕt ch¬ng tr×nh vá, awk vµ C, nhng ®iÒu ®ã l¹i cã thÓ kh«ng cã t¸c dông cho b¹n.)

ViÖc g¸n v« híng cã thÓ ®îc dïng nh mét gi¸ trÞ còng nh mét phÐp to¸n, nh trong C. Nãi c¸ch kh¸c, $a = 3 cã mét gi¸ trÞ, còng nh $a+3 cã mét gi¸ trÞ. Gi¸ trÞ chÝnh lµ sè ®îc g¸n, cho nªn gi¸ trÞ cña $a = 3 lµ 3. MÆc dÇu ®iÒu nµy dêng nh cã vÎ

Page 53: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

k× l¹ lóc tho¸ng nh×n, viÖc dïng mét phÐp g¸n nh mét gi¸ trÞ l¹i cã Ých nÕu b¹n muèn g¸n mét gi¸ trÞ trung gian trong mét biÓu thøc cho mét biÕn, hay nÕu b¹n muèn ®¬n gi¶n sao cïng mét gi¸ trÞ cho mét hay nhiÒu biÕn. Ch¼ng h¹n:

$b = 4 + ($a = 3); # g¸n 3 cho $a, råi céng kÕt qu¶ ®ã víi 4 ®Æt vµo $b, ®îc 7

$d = ($c = 5); # sao 5 vµo $c, vµ råi sao vµo $d$d = $c = 5; # còng ®iÒu Êy nhng kh«ng cã dÊu

ngoÆcThÝ dô cuèi lµm viÖc tèt v× phÐp g¸n cã tÝnh kÕt hîp bªn

ph¶i.To¸n tö g¸n hai ng«i

C¸c biÓu thøc nh $a = $a + 5 (trong ®ã cïng mét biÕn l¹i xuÊt hiÖn ë c¶ hai vÕ cña phÐp g¸n) thêng xuÊt hiÖn ®Õn møc Perl (gièng nh C) cã c¸ch viÕt t¾t cho phÐp to¸n lµm thay ®æi biÕn - to¸n tö g¸n hai ng«i. GÇn nh tÊt c¶ c¸c to¸n tö hai ng«i tÝnh mét gi¸ trÞ ®Òu cã d¹ng phÐp g¸n hai ng«i t¬ng øng víi dÊu b»ng cã bæ sung thªm phÇn tö. Ch¼ng h¹n, hai dßng sau ®©y lµ t¬ng ®¬ng:

$a = $a + 5 ; # kh«ng cã to¸n tö g¸n hai ng«i$a += 5 ; # cã to¸n tö g¸n hai ng«iVµ t¬ng tù nh thÕ:$b = $b * 3;$b *= 3;Trong tõng trêng hîp, to¸n tö nµy lµm cho gi¸ trÞ hiÖn t¹i cña

biÕn ®îc thay ®æi theo mét c¸ch nµo ®ã, thay v× ®¬n gi¶n ghi ®Ì lªn gi¸ trÞ nµy b»ng kÕt qu¶ cña mét biÓu thøc míi nµo ®ã.

To¸n tö g¸n th«ng dông kh¸c lµ to¸n tö ghÐp nèi x©u:$str = $str . “ ”; # thªm dÊuc¸ch vµo $str$str .= “ ”; # còng ®iÒu Êy víi to¸n tö g¸nGÇn nh tÊt c¶ c¸c to¸n tö hai ng«i ®Òu hîp lÖ theo c¸ch nµy.

Ch¼ng h¹n, to¸n tö n©ng lªn luü thõa cña sÏ ®îc viÕt lµ **=. Cho nªn, $a **= 3 cã nghÜa lµ “n©ng mét sè trong $a lªn luü thõa ba, råi ®Æt kÕt qu¶ trë l¹i $a”.

Gièng nh to¸n tö g¸n ®¬n, c¸c to¸n tö nµy còng cã mét gi¸ trÞ : gi¸ trÞ míi cña biÕn. Ch¼ng h¹n:

$a = 3;

Page 54: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$b = ($a += 4); # $a vµ $b c¶ hai b©y giê ®Òu lµ 7Nhng kh«ng may lµ trËt tù tÝnh to¸n cña c¸c to¸n h¹ng cña

to¸n tö hai ng«i l¹i kh«ng ®îc x¸c ®Þnh, cho nªn mét sè biÓu thøc kh«ng thÓ nµo ®îc x¸c ®Þnh hoµn toµn:

$a = 3;$b = ($a += 2) * ($a -= 2); # Ch¬ng tr×nh tåi: $b cã thÓ

lµ 15 hay 3NÕu to¸n h¹ng bªn ph¶i cña phÐp nh©n ®îc tÝnh ®Çu tiªn

th× kÕt qu¶ sÏ lµ 3 lÇn 1, hay 3. Tuy nhiªn, nÕu to¸n h¹ng bªn tr¸i ®îc tÝnh tríc to¸n h¹ng bªn ph¶i, th× nã lµ 5 lÇn 3, hay 15. B¹n chí cã lµm ®iÒu nµy, chõng nµo b¹n cßn cha vµo Cuéc tranh luËn Perl rèi r¾m.Tù t¨ng vµ tù gi¶m

Dõng còng ®· ®ñ dÔ dµng ®Ó thªm mét vµo $a b»ng viÖc nãi $a += 1. Perl cßn ®i xa h¬n vµ thËm chÝ l¹i cßn lµm ng¾n h¬n cho ®iÒu nµy n÷a. To¸n tö ++ (®îc gäi lµ to¸n tö tù t¨ng) céng thªm mét vµo to¸n h¹ng cña nã, vµ cho l¹i gi¸ trÞ ®· ®îc t¨ng, gièng nh:

$a += 1 ; # cã to¸n tö g¸n++$a; # víi tù t¨ng tiÒn tè$d = 17;$e = ++$d; # $e vµ $d b©y giê ®Òu lµ 18T¹i ®©y, to¸n tö ++ ®îc dïng nh to¸n tö tiÒn tè - tøc lµ, to¸n

tö xuÊt hiÖn ë bªn tr¸i to¸n h¹ng cña nã. PhÐp tù t¨ng còng cã thÓ ®îc dïng trong d¹ng hËu tè (n»m ë bªn ph¶i to¸n h¹ng cña nã). Trong trêng hîp nµy, kÕt qu¶ cña biÓu thøc nµy lµ gi¸ trÞ cña biÕn tríc khi biÕn ®îc t¨ng lªn. Ch¼ng h¹n,

$c = 17;$d = $c++; # $d lµ 17, nhng $c b©y giê lµ 18V× gi¸ trÞ cña to¸n h¹ng thay ®æi nªn to¸n h¹ng nµy ph¶i lµ

mét biÕn v« híng, kh«ng ph¶i lµ biÓu thøc. B¹n kh«ng thÓ nãi ++16 ®Ó cã ®îc 17, mµ còng kh«ng thÓ nãi ++($a+$b) lµ c¸ch nµo ®ã ®Ó cã ®îc gi¸ trÞ lín h¬n tæng cña $a vµ $b mét ®¬n vÞ.

To¸n tö tù gi¶m (--) còng t¬ng tù nh to¸n tö tù t¨ng, nhng trõ ®i mét thay v× céng víi mét. Gièng nh to¸n tö tù t¨ng, to¸n tö tù gi¶m còng cã d¹ng tiÒn tè vµ hËu tè. Ch¼ng h¹n:

$x = 12;--$x ; # $x b©y giê lµ 11

Page 55: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$y = $x-- ; # $y lµ 11, cßn $x b©y giê lµ 10Kh«ng gièng C, c¸c to¸n tö tù t¨ng vµ tù gi¶m lµm viÖc trªn

sè dÊu phÈy ®éng. Cho nªn viÖc t¨ng mét biÕn víi gi¸ trÞ 4.2 sÏ cho 5.2 nh dù kiÕn.To¸n tö chop()

Mét to¸n tö cã Ých kh¸c lµ chop(). To¸n tö tiÒn tè nµy nhËn mét ®èi bªn trong c¸c dÊu ngoÆc cña nã - tªn cña mét biÕn v« híng - vµ bá ®i kÝ tù cuèi cïng tõ gi¸ trÞ x©u cña biÕn ®ã. Ch¼ng h¹n:

$x = “Xin chµo mäi ngêi”;chop($x); # $x b©y giê lµ “Xin chµo mäi ngê”Lu ý r»ng gi¸ trÞ cña ®èi bÞ thay ®æi ë ®©y, do ®ã cÇn

ph¶i cã mét biÕn v« híng, thay v× chØ ®¬n gi¶n lµ gi¸ trÞ v« h-íng. SÏ lµ v« nghÜa, ch¼ng h¹n, ®Ó viÕt chop(‘suey’) ®Ó biÕn nã thµnh ‘sue’, v× kh«ng cã chç nµo ®Ó cÊt gi÷ gi¸ trÞ nµy. Bªn c¹nh ®ã, b¹n cã thÓ chØ viÕt ‘sue’ còng ®ñ.

To¸n tö nµy tr«ng gièng nh mét lêi gäi hµm, vµ qu¶ thùc cho l¹i mét gi¸ trÞ (mµ b¹n sÏ tr«ng ®îi nÕu b¹n quen thuéc víi lêi gäi hµm tõ c¸c ng«n ng÷). Gi¸ trÞ ®îc cho l¹i chÝnh lµ kÝ tù ®· bÞ lo¹i bá (ch÷ i trong ngêi ë trªn). §iÒu nµy cã nghÜa lµ ®o¹n m· sau ®©y cã lÏ sai:

$x = chop($x); # SAI: thay thÕ $x b»ng ksi tù cuèi cïng cña nã

chop($x); # §óng: nh trªn, lo¹i bá kÝ tù cuèiNÕu chop() ®îc cho mét x©u rçng, th× nã ch¼ng lµm g×

c¶, vµ ch¼ng cho l¹i g×, mµ còng kh«ng ®a ra lçi hay than v·n g×. PhÇn lín c¸c phÐp to¸n trong Perl ®Òu cã nh÷ng ®iÒu kiÖn nhËy c¶m - nãi c¸ch kh¸c, b¹n cã thÓ dïng chóng ngay s¸t c¹nh (vµ vît ra ngoµi) mµ thêng kh«ng cã lêi phµn nµn nµo. Mét sè ngêi biÖn minh r»ng ®©y lµ mét trong nh÷ng nhîc ®iÓm nÒn t¶ng cña Perl, trong khi sè cßn l¹i trong chóng ta th× vÉn viÕt ra nh÷ng ch¬ng tr×nh tøc cêi mµ ch¼ng ph¶i lo l¾ng g× vÒ phÇn riÒm bªn. B¹n quyÕt ®Þnh xem m×nh sÏ theo vµo phÝa nµo.Xen lÉn v« híng vµo trong x©u

Khi mét h»ng kÝ tù x©u lµ ®îc ®Æt trong nh¸y kÐp th× nã lµ chñ ®Ò cho viÖc xen lÉn biÕn (bªn c¹nh viÖc ®îc kiÓm tra cho lèi tho¸t sæ chÐo ngîc). §iÒu nµy cã nghÜa lµ x©u nµy ®îc

Page 56: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

duyÖt qua ®Ó t×m c¸c tªn biÕn* v« híng cã thÓ - cã nghÜa lµ dÊu ®« la ®i theo sau mét ch÷, sè hay dÊu g¹ch thÊp. Khi t×m thÊy mét tham kh¶o biÕn th× nã ®îc thay thÕ b»ng gi¸ trÞ hiÖn t¹i (hay bÊt k× x©u rçng nµo nÕu biÕn v« híng cßn cha ®-îc g¸n gi¸ trÞ nµo). Ch¼ng h¹n:

$a = “fred”;$b = “some text $a”; # $b b©y giê lµ “some text fred”$c = “no such variable $what”; # $c lµ “no such variable ”§Ó ng¨n c¶n viÖc thay thÕ mét biÕn b»ng gi¸ trÞ cña nã, b¹n

ph¶i hoÆc lµm thay ®æi phÇn ®ã cña x©u ®Ó cho nã xuÊt hiÖn trong ngoÆc ®¬n, hoÆc ®Æt tríc dÊu ®« la mét dÊu sæ chÐo ngîc, mµ sÏ t¾t ý nghÜa ®Æc biÖt cña dÊu ®« la:

$fred = ‘hi’;$barney = “a test of “.’$fred’; # h»ng kÝ hiÖu: ‘a test of

$fred’$barney2 = “a test of \$fred”; # còng nh vËyTªn biÕn sÏ lµ tªn biÕn dµi nhÊt cã thÓ mµ t¹o nªn nghÜa t¹i

phÇn ®ã cña x©u. §iÒu nµy cã thÓ lµ vÊn ®Ò nÕu b¹n muèn ®Æt sau ngay gi¸ trÞ ®îc thay thÕ víi mét v¨n b¶n h»ng mµ b¾t ®Çu »ng mét ch÷, sè hay dÊu g¹ch thÊp. V× Pserl duyÖt qua c¸c tªn biÕn nªn nã sÏ xÐt nh÷ng kÝ tù lµ c¸c kÝ tù tªn phô, mµ kh«ng ph¶i lµ ®iÒu b¹n muèn. Perl cung cÊp mét ®Þnh biªn cho tªn biÕn theo c¸c hÖ thèng¬ng tù nh líp vá. B¹n h·y ®¬n thuÇn bao tªn cña biÕn ®ã trong mét cÆp dÊu ngoÆc nhän. Hay b¹n cã thÓ kÕt thóc phÇn ®ã cña x©u vµ b¾t ®Çu mét phÇn kh¸c cña x©u b»ng to¸n tö ghÐp nèi:

$fred = ‘pay’; $fredday = “wrong!”;$barney = “It’s ’$fredday”; # kh«ng ph¶i payday, mµ lµ

“It’s wrong!”$barney = “It’s ’${fred}day”; # b©y giê, $barney lµ “It’s

payday!”$barney2 = “It’s $fred”; # c¸ch kh¸c ®Ó lµm viÖc ®ã$barney3 = “It’s “ . $fred . “day”; vµ mét c¸ch kh¸cTo¸n tö sæ chÐo ngîc chuyÓn hoa thêng cã thÓ ®îc dïng ®Ó

lµm thay ®æi ch÷ hoa thêng ®îc ®em theo cïng viÖc xen lÉn biÕn. Ch¼ng h¹n:

$bigfred = “\ufred”; # $bigfred lµ FRED$fred = “fred”; $bigfred = “\Ufred”; # cïng ®iÒu ®ã$capfred = “\u$fred”; # $capfred lµ “Fred”

* Vµ c¶ biÕn m¶ng n÷a, nhng chóng ta vÉn cßn cha biÕt ®Õn chóng chõng nµo cha tíi Ch¬ng 3, biÕn m¶ng

Page 57: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$barney = “\LBARNEY”; # $barney b©y giê lµ “barney”$capbarney = “\u\LBARNEY”; #capbarney b©y giê lµ

“Barney”$bigbarney = “BARNEY”; $capbarney = “\u\L$bigbarney”;

thÕNh b¹n cã thÓ thÊy, c¸c to¸n tö dÞch chuyÓn hoa thêng ®îc

ghi nhí bªn trong x©u chõng nµo chóng cßn cha ®îc dïng tíi, cho nªn ngay kÝ tù ®Çu tiªn cña BARNEY kh«ng tu©n theo \u, nã vÉn cßn lµ ch÷ hoa v× \u.

ThuËt ng÷ xen lÉn biÕn thêng ®îc dïng lÉn víi xen lÉn nh¸y kÐp, v× c¸c x©u cã nh¸y kÐp lµ chñ ®Ò cho viÖc xen lÉn biÕn.<STDIN> xem nh mét v« híng

T¹i ®iÓm nµy, nÕu b¹n lµ mét ngêi chuyªn nghiÖp lËp tr×nh th× b¹n cã thÓ tù hái lµm sao lÊy ®îc mét gi¸ trÞ vµo trong ch-¬ng tr×nh Perl. Sau ®©y lµ c¸ch ®¬n gi¶n nhÊt. Mçi lÇn b¹n dïng <STDIN> ë chç ®ang tr«ng ®îi mét gi¸ trÞ v« híng, th× Perl sÏ ®äc toµn bé dßng v¨n b¶n tiÕp tõ lèi vµo chuÈn (cho tíi dÊu dßng míi ®Çu tiªn), vµ dïng x©u ®ã nh gi¸ trÞ cho <STDIN>. §Çu vµo chuÈn cã thÓ mang nhiÒu nghÜa, nhng chõng nµo b¹n cßn cha lµm ®iÒu g× ®ã k× l¹, th× nã vÉn cßn mang nghÜa lµ thiÕt bÞ cuèi cña ngêi dïng, ngêi ®· gäi ch¬ng tr×nh cña b¹n (cã thÓ lµ b¹n). NÕu kh«ng cã g× chê ®îi ®Ó ®äc c¶ (trêng hîp ®iÓn h×nh, chõng nµo b¹n cßn cha gâ xong toµn bé dßng), th× ch¬ng tr×nh Perl sÏ dõng vµ ®îi cho b¹n ®a vµo mét sè kÝ tù theo sau b»ng mét dÊu dßng míi (xuèng dßng).

Gi¸ trÞ x©u cña <STDIN> vÒ ®iÓn h×nh cã mét dÊu dßng míi ë cuèi cña nã. Th«ng thêng nhÊt lµ b¹n muèn gì bá c¸i dÊu dßng míi ®ã ®i (cã sù kh¸c biÖt lín gi÷a hello vµ hello\n). §©y lµ chç mµ anh b¹n chóng ta, to¸n tö chop(), tíi cøu gióp. Mét d·y c¸i vµo ®iÓn h×nh ®a tíi mét c¸i g× ®ã tùa nh thÕ nµy:

$a = <STDIN>; # nhËn v¨n b¶nchop($a); # gì bá dÊu dßng míi khã chÞuC¸ch viÕt t¾t th«ng dông cho hai dßng nµy lµ:chop($a = <STDIN>) ;PhÐp g¸n bªn trong c¸c dÊu ngoÆc trßn tiÕp tôc lµ mét tham

kh¶o tíi $a, thËm chÝ sau khi nã ®· ®îc trao cho mét gi¸ trÞ víi to¸n tö <STDIN>. VËy, to¸n tö chop() lµm viÖc trªn $a. (§iÒu nµy lµ ®óng nãi chung ®èi víi to¸n tö g¸n - mét biÓu thøc g¸n cã thÓ ®îc dïng bÊt k× khi nµo mét biÕn lµ cÇn tíi, vµ nh÷ng

Page 58: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

hµnh ®éng tham kh¶o tíi biÕn ®ã ë bªn tr¸i cña dÊu b»ng.)§a ra b»ng print()

VËy ta thu ®îc mäi thø víi <STDIN>. Ta lµm sao ®a ra mäi thø ®©y? B»ng to¸n tö print() ®Êy. To¸n tö tiÒn tè nµy nhËn mét gi¸ trÞ v« híng bªn trong c¸c dÊu ngoÆc cña nã vµ ®a ra mµ kh«ng cÇn bÊt k× sù trang ®iÓm nµo lªn lèi ra chuÈn. Mét lÇn n÷a, chõng nµo b¹n cßn cha lµm ®iÒu g× k× l¹, th× lèi ra nµy vÉn cø lµ thiÕt bÞ cuèi cña b¹n. Ch¼ng h¹n:

print (“Xin chµo mäi ngêi\n”); # nãi chµo mäi ngêi, tiÕp lµ dÊu dßng míi

print “Xin chµo mäi ngêi\n”; # còng cïng ®iÒu ®ãLu ý r»ng thÝ dô thø hai chØ ra d¹ng cña print() kh«ng cã

dÊu ngoÆc. Trong thùc tÕ, nhiÒu to¸n tö tr«ng nh c¸c hµm còng cã d¹ng có ph¸p lµm viÖc kh«ng cÇn dÊu ngoÆc. Dï cã dïng hay kh«ng, dÊu ngoÆc còng gÇn nh lµ vÊn ®Ò vÒ kiÓu c¸ch vµ sù nhanh nhÈu trong c¸ch gâ, mÆc dÇu cã vµi trêng hîp b¹ nsÏ cÇn c¸c dÊu ngoÆc ®Ó lo¹i bá bít sù mËp mê.

Chóng ta sÏ thÊy r»ng b¹n thùc tÕ cã thÓ cho print mét danh s¸ch c¸c gi¸ trÞ, trong môc “Dïng print ®Ó ®a ra th«ng thêng” ë Ch¬ng 6, C¬ së vÒ vµo/ra, nhng chóng ta vÉn cßn cha nãi vÒ danh s¸ch, cho nªn chóng ta sÏ ho·n nã vÒ sau.Gi¸ trÞ undef

§iÒu g× sÏ x¶y ra nÕu b¹n dïng mét biÕn v« híng tríc khi b¹n cho nã mét gi¸ trÞ? Ch¼ng cã g× nghiªm träng c¶, vµ ch¼ng cã g× døt kho¸t sÏ g©y ®Þnh mÖnh c¶. C¸c biÕn ®Òu cã gi¸ trÞ undef tríc khi chóng ®îc g¸n lÇn ®Çu tiªn. Gi¸ trÞ nµy tr«ng nh sè kh«ng khi ®îc dïng nh mét sè, hay x©u rçng chiÒu dµi kh«ng nÕu ®îc dïng nh mét x©u.

NhiÒu to¸n tö cho l¹i undef khi c¸c ®èi vît ra ngoµi ph¹m vi vµ thµnh v« nghÜa. NÕu b¹n kh«ng lµm ®iÒu g× ®Æc biÖt th× b¹n sÏ nhËn ®îc kh«ng hay x©u kh«ng mµ kh«ng cã hËu qu¶ g× lín. Trong thùc hµnh, ®iÒu nµy gÇn nhu kh«ng g©y ra vÊn ®Ò g×.

Mét to¸n tö mµ chóng ta ®· thÊy cã cho l¹i undef trong hoµn c¶nh nµo ®ã lµ to¸n tö <STDIN>. Th«ng thêng to¸n tö nµy cho l¹i mét x©u cña dßng tiÕp võa ®îc ®äc, tuy nhiªn (nh khi b¹n gâ control-D t¹i thiÕt bÞ cuèi, hay khi mét tÖp kh«ng cßn d÷ liÖu n÷a), th× to¸n tö nµy cho l¹i undef nh mét gi¸ trÞ. Chóng ta sÏ thÊy trong ch¬ng 6 c¸ch kiÓm t¶ ®iÒu nµy vµ chän hµnh

Page 59: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

®éng ®Æc biÖt khi kh«ng cßn d÷ liÖu nµo cã s½n ®Ó ®äc n÷a.

Bµi tËpXem Phô lôc A vÒ lêi gi¶i.

1. H·y viÕt mét ch¬ng tr×nh tÝnh chu vi ®êng trßn víi b¸n kÝnh 12.5. Chu vi b»ng 2 lÇn b¸n kÝnh, hay kho¶ng 2 lÇn 3.141592654.

2. H·y söa ®æi ch¬ng tr×nh nµy tõ bµi tËp tríc ®Ó nh¾c viÖc nhËn b¸n kÝnh tõ ngêi ch¹y ch¬ng tr×nh.

3. H·y viÕt mét ch¬ng tr×nh nh¾c vµ ®äc vµo hai sè, råi in ra kÕtqu¶ cña viÖc nh©n hai sè ®ã.

4. H·y viÕt mét ch¬ng tr×nh ®äc mét x©u vµ mét sè råi in ra x©u sè lÇn ®îc chØ ra bëi sè c¸c dßng t¸ch biÖt. (Híng dÉn: h·y dïng to¸n tö “x”.)

Page 60: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

3

D÷ liÖu m¶ng

vµ danh s¸ch

M¶ng lµ g×?M¶ng lµ mét danh s¸ch cã thø tù c¸c d÷ liÖu v« híng. Mçi

phÇn tö cña m¶ng ®Òu lµ mét biÕn v« híng t¸ch biÖt víi mét gi¸ trÞ v« híng ®éc lËp. C¸c gi¸ trÞ nµy lµ ®îc s¾p thø tù - tøc lµ chóng cã mét tr×nh tù ®Æc biÖt tõ phÇn tö thÊp nhÊt ®Õn cao nhÊt.

M¶ng cã thÓ cã bÊt k× sè phÇn tö nµo. M¶ng nhá nhÊt kh«ng cã phÇn tö nµo, trong khi m¶ng lín nhÊt th× cã thÓ lÊp kÝn toµn bé bé nhí cã s½n. Mét lÇn n÷a, ®iÒu nµy l¹i ®îc gi÷ hîp víi triÕt lÝ cña Perl vÒ “kh«ng cã giíi h¹n kh«ng cÇn thiÕt nµo.”BiÓu diÔn h»ng kÝ hiÖu

Mét h»ng kÝ hiÖu m¶ng (c¸ch thøc b¹n biÓu diÔn gi¸ trÞ cña mét m¶ng bªn trong ch¬ng tr×nh m×nh) lµ mét danh s¸ch c¸c gi¸ trÞ t¸ch nhau b»ng dÊu phÈy vµ ®îc bao trong dÊu ngoÆc trßn. Nh÷ng gi¸ trÞ nµy t¹o nªn c¸c phÇn tö cña danh s¸ch. Ch¼ng h¹n:

(1,2,3) # m¶ng gåm ba gi¸ trÞ 1, 2 vµ 3(“fred”, 4.5)# hai gi¸ trÞ, “fred” vµ 4.5C¸c phÇn tö cña m¶ng kh«ng nhÊt thiÕt lµ h»ng - chóng cã

thÓ lµ biÓu thøc mµ sÏ ®îc tÝnh míi l¹i mçi lÇn h»ng ®îc sö dông. Ch¼ng h¹n:

($a, 17) # hai gi¸ trÞ: gi¸ trÞ hiÖn t¹i cña $a, vµ 17($b+$c,$d+$e) # hai gi¸ trÞM¶ng rçng (m¶ng kh«ng cã phÇn tö nµo) ®wjc biÓu diÔn

b»ng mét cÆp dÊu ngoÆc rçng:() # m¶ng rçng (kh«ng phÇn tö)Mét phÇn tö cña m¶ng cã thÓ bao gåm to¸n tö cÊu tö m¶ng,

Trong ch¬ng nµy: M¶ng lµ g×? BiÓu diÔn

h»ng kÝ hiÖu BiÕn To¸n tö Ng÷ c¶nh v«

híng vµ m¶ng <STDIN> xem

nh m¶ng BiÕn Xem lÉn

Page 61: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

®îc chØ ra bëi hai gi¸ trÞ v« híng t¸ch nhau bëi hai dÊu chÊm liªn tiÕp. To¸n tö nµy t¹o ra mét danh s¸ch c¸c gi¸ trÞ b¾t ®Çu t¹i gi¸ trÞ v« híng bªn tr¸i kÐo cho tíi gÝa trÞ v« híng bªn ph¶i, mçi lÇn t¨ng lªn mét. Ch¼ng h¹n:

(1..5) # gièng nh (1, 2, ,3 ,4, 5)(1.2..5.2) # gièng nh (1.2, 2.2, 3.2, 4.2, 5.2)(2..6,10,12) # gièng nh (2,3,4,5,6,10,12)($a..$b) # ph¹m vi ®îc x¸c ®Þnh bëi gi¸ trÞ hiÖn t¹i cña

$a vµ $bNÕu gi¸ trÞ v« híng bªn ph¶i bÐ h¬n v« híng bªn tr¸i th× sÏ

t¹o ra danh s¸ch rçng - b¹n kh«ng thÓ ®Õm ngîc trËt tù cña c¸c gi¸ trÞ. NÕu gi¸ trÞ cuèi cïng kh«ng ph¶i lµ toµn bé sè bíc trªn gi¸ trÞ ban ®Çu th× danh s¸ch sÏ dõng chØ ngay tríc gi¸ trÞ tiÕp mµ sÏ vît ra ngoµi ph¹m vi:

(1.3..6.1) # gièng nh (1.3, 2.3, 3.3, 4.3, 5.3)Mét c¸ch dïng cña h»ng kÝ hiÖu m¶ng lµ nh ®èi cña to¸n tö

print() ®· ®îc giíi thiÖu tríc ®©y. C¸c phÇn tö cña danh s¸ch nµy ®îc in ra mµ kh«ng cã bÊt k× kho¶ng trèng xen thªm vµo:

print (“C©u tr¶ lêi lµ ”, $a, “\n”) ; # ba phÇn tö m¶ng h»ng kÝ hiÖu

C©u lÖnh nµy in ra “C©u tr¶ lêi lµ”, theo sau bëi mét dÊu c¸ch, gi¸ trÞ cña $a, vµ dÊu dßng míi. Ta h·y chuyÓn sang c¸ch dïng kh¸c cho h»ng kÝ hiÖu m¶ng.BiÕn

Mét biÕn m¶ng gi÷ mét gi¸ trÞ m¶ng riªng (kh«ng hay nhiÒu gi¸ trÞ v« híng). C¸c tªn biÕn m¶ng lµ t¬ng tù víi c¸c tªn biÕn v« híng, chØ kh¸c kÝ tù khëi ®Çu, lµ mét dÊu @ chø kh«ng ph¶i lµ dÊu ®« la $. Ch¼ng h¹n:

@fred # biÕn m¶ng @fred@A_Very_Long_Array_Variable_Name@A_Very_Long_Array_Variable_Name_that_is_differentLu ý r»ng biÕn m¶ng @fred lµ kh«ng cã quan hÖ g× theo

bÊt k× c¸ch nµo víi biÕn v« híng $fred. Perl duy tr× kh«ng gian tªn t¸ch biÖt cho c¸c kiÓu ®èi tîng kh¸c nhau.

Gi¸ trÞ cña mét biÕn m¶ng mµ cha ®îc g¸n lµ (), danh s¸ch rçng.

Mét biÓu thøc cã thÓ tham kh¶o tíi c¸c biÕn m¶ng nh mét tæng thÓ, hoÆc nã cã thÓ xem xÐt vµ thay ®æi tõng phÇn tö cña m¶ng ®ã.

Page 62: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

To¸n töC¸c to¸n tö m¶ng hµnh ®éng trªn c¸c m¶ng nh mét tæng

thÓ. Mét sè to¸n tö m¶ng cã thÓ cho l¹i mét gi¸ trÞ m¶ng, mµ cã thÓ hoÆc ®îc dïng nh mét gi¸ trÞ cho to¸n tö m¶ng kh¸c, hoÆc ®îc g¸n vµo mét biÕn m¶ng kh¸c.PhÐp g¸n

Cã lÏ to¸n tö m¶ng quan träng nhÊt lµ to¸n tö g¸n m¶ng, cho m¶ng mét gi¸ trÞ. Nã lµ dÊu b»ng, gièng nh to¸n tö g¸n v« híng. Perl x¸c ®Þnh liÖu phÐp g¸n cã lµ phÐp g¸n v« híng hay phÐp g¸n m¶ng b»ng viÖc ®Ó ý xem liÖu phÐp g¸n lµ cho biÕn v« h-íng hay m¶ng* . Ch¼ng h¹n:

@fred = (1,2,3); # m¶ng fred nhËn ba phÇn tö h»ng kÝ hiÖu

@barney = @fred; # b©y giê ®îc sao sang @barneyNÕu mét gi¸ trÞ v« híng ®îc g¸n vµo trong mét biÕn m¶ng

th× gi¸ trÞ v« híng trë thµnh phÇn tö duy nhÊt cña m¶ng:@huh = 1; # 1 ®îc ®Æt cho danh s¸ch (1) mét c¸ch tù

®éngTªn biÕn m¶ng cã thÓ xuÊt hiÖn trong danh s¸ch h»ng kÝ

hiÖu m¶ng. Khi gi¸ trÞ cña danh s¸ch ®îc tÝnh th× Perl thay thÕ tªn biÕn m¶ng b»ng gi¸ trÞ hiÖn t¹i cña m¶ng ®ã, gièng vËy:

@fred = (“mét”, “hai”);@barney = (4,5,@fred, 6, 7); @barney trë thµnh

(4,5,”mét”,”hai”,6,7)@barney = (8, @barney); # ®Æt 8 vµo tríc @barney@barney = (@barney, “cuèi”); # vµ “cuèi” lµ ë cuèi# @barney b©y giê lµ (8,4,5,”mét”,”hai”,6,7,”cuèi”)Lu ý r»ng c¸c phÇn tö m¶ng ®îc thªm vµo ®Òu ë cïng møc

nh phÇn cßn l¹i cña h»ng kÝ hiÖu - mét danh s¸ch kh«ng thÓ chøa mét danh s¸ch kh¸c nh mét phÇn tö* .

NÕu mét m¶ng h»ng kÝ hiÖu chØ chøa c¸c tham kh¶o biÕn (kh«ng ph¶i lµ biÓu thøc) th× m¶ng h»ng kÝ hiÖu Êy còng cã thÓ ®îc xö lÝ nh mét biÕn. Nãi c¸ch kh¸c, mét m¶ng h»ng kÝ hiÖu nh thÕ cã thÓ ®îc dïng ë vÕ bªn tr¸i cña phÐp g¸n. Mçi biÕn v« híng trong m¶ng kÝ hiÖu nhËn mét gi¸ trÞ t¬ng øng tõ danh s¸ch ë vÕ ph¶i cña phÐp g¸n. Ch¼ng h¹n:* §iÒu nµy ¸p dông cho “lvalue” v« híng hay m¶ng còng nh c¸c biÕn ®¬n* Perl 5.0 cho phÐp mét tham kh¶o danh s¸ch lµ mét phÇn tö danh s¸ch, nhng ®Êy vÉn kh«ng ph¶i lµ danh s¸ch nh mét phÇn tö danh s¸ch

Page 63: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

($a, $b, $c) = (1, 2, 3); # ®Æt 1 cho $a, 2 cho $b, 3 cho $c($a, $b) = ($b, $a); # tr¸o ®æi $a vµ $b($d, @fred) = ($a, $b, $c); # ®Æt $a cho $d, vµ ($b,$c) cho

@fred($e,@fred) = @fred; # lo¹i bá phÇn tö thø nhÊt cña @fred

lµ $e # ®iÒu nµy lµm cho @fred = ($c) vµ $e = $bNÕu sè phÇn tö ®îc g¸n kh«ng s¸nh ®óng víi sè c¸c biÕn

®Ó gi÷ c¸c gi¸ trÞ th× mäi gi¸ trÞ vît qu¸ (ë vÕ ph¶i cña dÊu b»ng) ®Òu im lÆng bÞ lo¹i bá, vµ bÊt k× biÕn vît qu¸ nµo (ë vÕ tr¸i cña dÊu b»ng) ®Òu ®îc cho gi¸ trÞ undef.

Mét biÕn m¶ng xuÊt hiÖn trong danh s¸ch m¶ng h»ng kÝ hiÖu ®Òu ph¶i ë cuèi, v× biÕn m¶ng lµ “tham lam”, vµ nã tiªu thô tÊt c¶ c¸c gi¸ trÞ cßn l¹i. (Nµy, b¹n cã thÓ ®Æt c¸c biÕn kh¸c sau nã, nhng chóng sÏ chØ nhËn gi¸ trÞ undef mµ th«i.)

NÕu mét biÕn m¶ng ®îc g¸n cho mét biÕn v« híng th× sè ®îc g¸n lµ chiÒu dµi cña m¶ng, nh trong:

@fred = (4, 5, 6); # khëi ®Çu @fred$a = @fred; # $a nhËn phÇn tö ®Çu tiªn cña @fredChiÒu dµi còng ®îc cho l¹i nÕu mét tªn biÕn m¶ng ®îc dïng

trong hÇu hÕt mäi chç mµ mét gi¸ trÞ v« híng ®ang ®îc cÇn tíi. (Trong môc díi ®©y cã tªn “Hoµn c¶nh v« híng m¶ng”, chóng ta sÏ thÊy r»ng ®iÒu nµy qu¶ lµ ®îc gäi nh vËy víi viÖc dïng tªn m¶ng trong hoµn c¶nh v« híng.) Ch¼ng h¹n, ®Ó lÊy gi¸ trÞ bÐ h¬n chiÒu dµi m¶ng mét ®¬n vÞ, b¹n cã thÓ dïng @fred-1, v× to¸n tö trõ v« híng cÇn c¸c v« híng cho c¶ hai to¸n h¹ng cña nã. Chó ý ®iÒu sau:

$a = @fred; # $a nhËn chiÒu dµi cña @fred($a) = @fred; # $a nhËn phÇn tö ®Çu tiªn cña @fredPhÐp g¸n ®Çu tiªn lµ phÐp g¸n v« híng, vµ do vËy @fred ®îc

®èi xö nh mét v« híng, cho l¹i chiÒu dµi cña nã. PhÐp g¸n thø hai lµ phÐp g¸n m¶ng (cho dï chØ mét gi¸ trÞ lµ cÇn tíi), vµ do vËy cho phÇn tö ®Çu tiªn cña @fred, im lÆng bá ®i tÊt c¶ phÇn cßn l¹i.

Gi¸ trÞ cña phÐp g¸n m¶ng lµ chÝnh b¶n th©n gi¸ trÞ m¶ng, vµ cã thÓ ®îc xÕp tÇng nh b¹n cã thÓ lµm víi c¸c phÐp g¸n v« híng. Ch¼ng h¹n:

@fred = (@barney = (2,3,4)); # @fred vµ @barney nhËn (2,3,4)

@fred = @barney = (2,3,4); # cïng ®iÒu Êy

Page 64: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Th©m nhËp phÇn töCho tíi nay, chóng ta vÉn xö lÝ m¶ng nh mét tæng thÓ, thªm

vµo vµ bá bít c¸c gi¸ trÞ b»ng viÖc thùc hiÖn g¸n m¶ng. NhiÒu ch¬ng tr×nh cã Ých ®· ®îc x©y dùng dïng m¶ng mµ thËm chÝ ch¼ng th©m nhËp vµo phÇn tö m¶ng nµo. Tuy nhiªn, Perl cung cÊp to¸n tö chØ sè truyÒn thèng ®Ó tham kh¶o tíi mét phÇn tö m¶ng theo chØ sè.

Víi to¸n tö chØ sè m¶ng, c¸c phÇn tö m¶ng ®Òu ®îc ®¸nh sè b»ng viÖc dïng sè nguyªn tuÇn tù, b¾t ®Çu tõ kh«ng* vµ t¨ng lªn mét cho mçi phÇn tö. PhÇn tö ®Çu tiªn cña m¶ng @fred mµ ®îc th©m nhËp tíi lµ $fred[0]. Chó ý r»ng @ trªn tªn m¶ng trë thµnh $ trªn tham kh¶o phÇn tö. §ã lµ v× viÖc tham kh¶o tíi mét phÇn tö cña m¶ng x¸c ®Þnh ra mét biÕn v« híng (mét phÇn cña m¶ng), mµ cã thÓ hoÆc ®îc g¸n cho, hoÆc cã gi¸ trÞ hiÖn t¹i cña nã ®îc dïng trong mét biÓu thøc, kiÓu nh:

@fred = (7,8,9);$b = $fred[0]; # ®Æt 7 vµo $b (phÇn tö ®Çu tiªn cña

@fred)$fred[0] = 5; # b©y giê @fred = (5,8,9)Còng cã thÓ th©m nhËp tíi c¸c phÇn tö kh¸c dÔ t¬ng tù, nh

trong:$c = $fred[1]; $ ®Æt 8 cho $c$fred[2]++; # t¨ng phÇn tö thø ba cña @fred$fred[1] += 4; # céng 4 vµo phÇn tö thø hai($fred[0], $fred[1]) = ($fred[1], $fred[0]); # tr¸o ®æi hai

phÇn tö ®ÇuViÖc th©m nhËp vµo mét danh s¸ch c¸c phÇn tö tõ cïng

m¶ng (nh trong thÝ dô cuèi) ®îc gäi lµ l¸t c¾t, vµ thêng xuÊt hiÖn ®Õn møc cã mét c¸ch biÓu diÔn ®Æc biÖt cho nã:

@fred[0,1] # hÖt nh ($fred[0], $fred[1])@fred[0,1] = @fred[1,0] # tr¸o ®æi hai phÇn tö ®Çu@fred[0,1,2] = @fred[1,1,1] # lµm cho c¶ 3 phÇn tö gièng

phÇn tö thø hai@fred[1,2] = (9,10); # ®æi hai gi¸ trÞ cuèi thµnh 9 vµ 10Chó ý r»ng l¸t c¾t nµy dïng tiÒn tè @ chø kh«ng lµ $. §iÒu

nµy lµ v× b¹n ®ang t¹o ra mét biÕn m¶ng b»ng viÖc chän mét * Còng cã thÓ thay ®æi gi¸ trÞ chØ sè cña phÇn tö ®Ç utiªn thµnh mét sè nµo ®ã kh¸c (nh mét) b»ng viÖc ®Æt gi¸ trÞ cho biÕn $[. Tuy nhiªn, lµm nh vËy cã ¶nh hëng toµn côc, mµ cã thÓ g©y lÉn lén ngêi sÏ b¶o tr× ch¬ng tr×nh cña b¹n, vµ cã thÓ lµm tan vì ch¬ng tr×nh b¹n nhËn ®îc tõ ngêi kh¸c. Do vËy, chóng t«i khuyªn b¹n nªn coi ®©y lµ mét tÝnh n¨ng kh«ng nªn dïng.

Page 65: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

phÇn cña m¶ng chø kh«ng ph¶i lµ biÕn v« híng chØ th©m nhËp vµo mét phÇn tö.

L¸t c¾t còng lµm viÖc trªn danh s¸ch h»ng kÝ hiÖu, hay bÊt k× to¸n tö nµo cho l¹i mét gi¸ trÞ danh s¸ch:

@who = (“fred”,”barney”,”betty”,”wilma”)[2,3] ;# gièng nh @x = (“fred”,”barney”,”betty”,”wilma”); @who

= @x[2,3]C¸c gi¸ trÞ chØ sè trong nh÷ng thÝ dô nµy lµ c¸c sè nguyªn

h»ng kÝ hiÖu, nhng chØ sè còng cã thÓ lµ bÊt k× biÓu thøc nµo cho l¹i mét sè, mµ råi ®îc dïng ®Ó chän phÇn tö thÝch hîp:

@fred = (7,8,9);$a = 2;$b = $fred[$a]; # gièng $fred[2], hay gi¸ trÞ 9$c = $fred[$a-1]; # $c nhËn $fred[1], hay 8($c) = (7,8,9) [$a-1]; # còng ®iÒu ®ã nhng dïng l¸t c¾tVËy ch¬ng tr×nh Perl cã thÓ cã viÖc th©m nhËp m¶ng t¬ng

tù nh c¸c ng«n ng÷ lËp tr×nh truyÒn thèng.ý tëng nµy vÒ viÖc dïng mét biÓu thøc cho chØ sè còng cã

t¸c dông cho c¸c l¸t c¾t. Tuy nhiªn b¹n h·y nhí r»ng chØ sè cho l¸t c¾t ;µ mét danh s¸ch c¸c gi¸ trÞ, cho nªn biÓu thøc nµy lµ mét biÓu thøc m¶ng, thay v× lµ motä biÓu thøc v« híng.

@fred = (7,8,9); # nh trong thÝ dô tríc@barney = (2,1,0);@backfred = @fred[@barney];# gièng nh @fred[2,1,0], hay ($fred[2],$fred[1],$fred[0]), # hay (9,8,7)NÕu b¹n th©m nhËp vµo mét phÇn tö m¶ng bªn ngoµi hai

®Çu cña m¶ng hiÖn t¹i (tøc lµ mét chØ sè bÐ h¬n kh«ng hay lín h¬n chØ sè cña phÇn tö cuèi cïng), th× gi¸ trÞ undef sÏ ®îc cho l¹i mµ kh«ng cã lêi c¶nh b¸o. Ch¼ng h¹n:

@fred = (1,2,3);$barney = $fred[7]; # $barney b©y giê lµ undefViÖc g¸n mét gi¸ trÞ bªn ngoµi ®Çu cña m¶ng hiÖn t¹i sÏ tù

®éng më réng m¶ng (cho mét gi¸ trÞ undef cho tÊt c¶ c¸c gi¸ trÞ trung gian, nÕu cã). Ch¼ng h¹n:

@fred = (1,2,3);$fred[3] = “hi”; # @fred b©y giê lµ (1,2,3,”hi”)$fred[6] = “ho”; # @fred b©y giê lµ (1,2,3,”hi”,undef,”ho”)PhÐp g¸n cho mét phÇn tö m¶ng cã chØ sè bÐ h¬n kh«ng lµ

Page 66: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

lçi ®Þnh mÖnh, v× nã cã thÓ lµm ph¸t sinh kiÓu c¸ch lËp tr×nh rÊt xÊu.

B¹n cã thÓ dïng $#fred ®Ó lÊy gi¸ trÞ chØ sè cña phÇn tö cuèi cña @fred. (§iÒu nµy gièng nh tham kh¶o vá C). B¹n thËm chÝ cßn cã thÓ g¸n vµo trong gi¸ trÞ nµy ®Ó lµm thay ®æi chiÒu dµi hiÓn nhiªn cña @fred, lµm cho nã to lªn hay co l¹i, nh-ng ®iÒu ®ã nãi chung lµ kh«ng cÇn thiÕt, v× m¶ng thêng to lªn hay co l¹i mét c¸ch tù ®éng.C¸c to¸n tö push() vµ pop()

Mét c¸ch dïng th«ng dông cña m¶ng lµ nh mét chång th«ng tin, n¬i nh÷ng gi¸ trÞ míi ®îc thªm vµo vµ lÊy ®i tõ phÝa bªn ph¶i cña danh s¸ch. Nh÷ng phÐp to¸n nµy thêng xuÊt hiÖn ®Õn møc chóng cã c¸c hµm ®Æc biÖt cña riªng chóng:

push(@mylist,$newvalue); # gièng @mylist = (@mylist, $newvalue)

$oldvalue = pop(@mylist); # lÊy ra phÇn tö cuèi cña @mylist

To¸n tö pop() cho l¹i undef nÕu ®èi cña nã lµ danh s¸ch rçng, thay v× lµm ®iÒu g× ®ã kh¸c kiÓu Perl nh phµn nµn hay sinh ra th«ng b¸o lçi.

To¸n tö push() còng chÊp nhËn mét danh s¸ch c¸c gi¸ trÞ cÇn ®îc ®Èy vµo danh s¸ch. C¸c gi¸ trÞ ®îc ®Èy vµo cuèi cña danh s¸ch. Ch¼ng h¹n:

@mylist = (1,2,3);push(@mylist,4,5,6); # @mylist = (1,2,3,4,5,6)Chó ý r»ng ®èi thø nhÊt ph¶i lµ mét tªn biÕn m¶ng* - ®Èy

vµo vµ lÊy ra sÏ kh«ng cã nghÜa víi danh s¸ch h»ng kÝ hiÖu.C¸c to¸n tö shift() vµ unshift()

C¸c to¸n tö push() vµ pop() lµm mäi ®iÒu ë bªn “ph¶i” cña danh s¸ch (phÇn víi chØ sè cao nhÊt). T¬ng tù thÕ, c¸c to¸n tö unshift() vµ shift() thùc hiÖn nh÷ng hµnh ®éng t¬ng øng vÒ bªn “tr¸i” cña mét danh s¸ch (phÇn víi chØ sè thÊp nhÊt). Sau ®©y lµ vµi thÝ dô:

unshift(@fred,$a); # nh @fred = ($a,@fred);unshift(@fred,$a,$b,$c); # nh @fred = ($a, $b, $c, @fred);$x = shift(@fred); # nh ($x,@fred) = @fred;# víi mét sè gi¸ trÞ thùc

* Trong thùc tÕ, b¹n cã thÓ bá @ mÆc dÇu t«i nghe nãi r»ng Perl 5.0 l¹i ®ßi hái nã.

Page 67: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

@fred = (5,6,7);unshift(@fred,2,3,4); # @fred b©y giê lµ (2,3,4,5,6,7)$x = shift(@fred); # $x nhËn 2, $fred nhËn b©y giê lµ

(3,4,5,6,7)Nh víi pop(), shift() cho l¹i undef nÕu biÕn m¶ng lµ rçng.

To¸n tö reverse()To¸n tö reverse() ®¶o ngîc trËt tù c¸c phÇn tö cña ®èi cña

nã, cho l¹i danh s¸ch kÕt qu¶. Ch¼ng h¹n:@a = (7,8,9);@b = reverse(@a); # ®Æt $b gi¸ trÞ (9,8,7)$b = reverse(7,8,9); # còng viÖc ÊyChó ý r»ng danh s¸ch ®èi lµ kh«ng bÞ thay ®æi - to¸n tö

reverse() chØ lµm viÖc trªn b¶n sao. NÕu b¹n muèn ®¶o ngîc mét m¶ng “t¹i chç”, th× b¹n cÇn g¸n nã ngîc trë l¹i cho cïng biÕn:

@b = reverse(@b); # ®¨th @b lµ ®¶o ngîc cña chÝnh nãTo¸n tö sort()

To¸n tö sort() lÊy ®èi cña nã vµ s¾p xÕp chóng dêng nh chóng tÊt c¶ ®Òu lµ c¸c x©u theo trËt tù ASCII t¨ng dÇn. Nã cho l¹i danh s¸ch ®· s¾p xÕp, kh«ng lµm thay ®æi danh s¸ch gèc. Ch¼ng h¹n:

@x = sort(“small”, “medium”, “large”);# @x nhËn “large”, “medium”, “small”

@y = (1,2,4,8,16,32,64);@y = sort(@y); # @y nhËn 1, 16, 2, 32, 4, 64, 8Chó ý r»ng c¸c sè s¾p xÕp kh«ng xuÊt hiÖn theo thø tù sè,

nhng theo gi¸ trÞ x©u cña tõng sè (1, 16, 2, 32, v©n v©n). Trong môc “S¾p xÕp n©ng cao”, ë Ch¬ng 15, ViÖc biÕn ®æi d÷ liÖu kh¸c, b¹n sÏ häc c¸ch s¾p xÕp theo sè, hoÆc theo thø tù gi¶m, hay theo kÝ tù thø ba cña tõng x©u, hay bÊt k× ph-¬ng ph¸p nµo kh¸c mµ b¹n chän.To¸n tö chop()

To¸n tö chop() lµm viÖc trªn biÕn m¶ng còng nh biÕn v« h-íng. Mçi phÇn tö cña m¶ng ®Òu cã kÝ tù cuèi bÞ bá ®i. §iÒu nµy cã thÓ lµ thuËn tiÖn khi b¹n ®äc mét danh s¸ch c¸c dßng nh c¸c phÇn tö m¶ng t¸ch b¹ch, vµ b¹n muèn bá ®i dÊu dßng míi trong tÊt c¶ c¸c dßng ngay lËp tøc. Ch¼ng h¹n:

Page 68: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

@stuff = (“hello\n”, “world\n”, “happy day”);chop(@stuff); # @stuff b©y giê lµ (“hello”, “world”, happy

day”)Hoµn c¶nh v« híng vµ m¶ng

Nh b¹n cã thÓ thÊy, tõng to¸n tö ®Òu ®îc thÕt kÕ ®Ó ho¹t ®éng trªn mét sè tæ hîp x¸c ®Þnh c¸c v« híng hay m¶ng, vµ cho l¹i mét v« híng hay m¶ng. NÕu mét to¸n tö tr«ng ®îi mét to¸n h¹ng lµ v« híng th× ta nãi r»ng to¸n h¹ng ®ã lµ ®îc tÝnh trong hoµn c¶nh v« híng. T¬ng tù, nÕu mét to¸n h¹ng ®ang tr«ng ®îi mét gi¸ trÞ m¶ng th× ta nãi r»ng to¸n h¹ng ®ã lµ ®îc tÝnh trong hoµn c¶nh m¶ng.

Th«ng thêng, ®iÒu nµy lµ kh¸ th«ng thêng. Nhng ®«i khi b¹n nhËn ®îc mét thao t¸c hoµn toµn kh¸c tuú theo liÖu b¹n ®ang trong hoµn c¶nh v« híng hay m¶ng. Ch¼ng h¹n, @fred cho l¹i néi dung cña m¶ng @fred trong hoµn c¶nh m¶ng, nhng cho l¹i chiÒu dµi cña m¶ng ®ã trong hoµn c¶nh v« híng. Nhng sù tinh vi nµy sÏ ®îc nh¾c tíi khi c¸c to¸n tö ®ã ®îc m« t¶.

NÕu b¹n muèn buéc mét biÓu thøc ph¶i ®îc tÝnh trong hoµn c¶nh v« híng th× b¹n cã thÓ ghÐp nèi mét x©u kh«ng vµo cho nã*. Ch¼ng h¹n:

@a = (“x”,”y”,”z”);print (“T«i thÊy ”, @a, “ phÇn tö\n”); # sai, sÏ in lµ “xyz”

cho @aprint (“T«i thÊy ”,””.@a, “ phÇn tt\n”); # ®óng, in 3 cho @aT¹i ®©y, chóng ta ®· nèi x©u kh«ng “” vµo @a, lµm nÈy

sinh x©u “3”, mµ råi trë thµnh mét phÇn cña danh s¸ch cho print.

Mét gi¸ trÞ v« híng ®îc dïng bªn trong mét hoµn c¶nh m¶ng th× sÏ ®îc coi nh m¶ng mét phÇn tö.<STDIN> nh mét m¶ng

Mét to¸n tö ta ®· thÊy tríc ®©y còng cho gi¸ trÞ kh¸c tong hoµn c¶nh m¶ng lµ <STDIN>. Nh ®· m« t¶ tríc ®©y, <STDIN> cho dßng tiÕp cña c¸i vµo trong hoµn c¶nh v« híng. B©y giê, trong hoµn c¶nh m¶ng, to¸n tö nµy cho l¹i tÊt c¶ phÇn dßng cßn l¹i cho tíi cuèi tÖp. Mçi dßng ®Òu ®îc cho l¹i nh mét phÇn tö t¸ch b¹ch cña danh s¸ch. Ch¼ng h¹n:

@a = <STDIN>; # ®äc c¸i vµo chuÈn trong hoµn c¶nh m¶ng* B¹n còng cã thÓ dïng to¸n tö scalar() nhng chóng ta sÏ kh«ng nãi vÒ ®iiÒu ®ã ë ®©y.

Page 69: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

NÕu mét ngêi ch¹y ch¬ng tr×nh nµy gâ vµo ba dßng, råi nhÊn Control-D (®Ó chØ ra “cuèi tÖp”), th× m¶ng kÕt thóc víi ba phÇn tö. Mçi phÇn tö sÏ lµ mét x©u mµ kÕt thóc b»ng m«t jdÊu dßng míi, t¬ng øng víi ba dßng cã kÕt thóc lµ dÊu dßng míi ®· gâ vµo.Xen lÉn biÕn m¶ng

Gièng nh c¸c v« híng, c¸c gi¸ trÞ m¶ng cã thÓ ®îc ®Ó xen lÉn trong x©u cã nh¸y kÐp. Mét phÇn tö riªng cña mét m¶ng sÏ ®îc thay thÕ bëi gi¸ trÞ cña nã, gièng nh:

@fred = (“hello”, “dolly”);$y = 2;$x = “This is $fred[1]’s place”; # “This is dolly’s place”$x = “This is $fred[$y-1]’s place”; # còng c©u ÊyChó ý r»ng biÓu thøc chØ sè ®îc tÝnh nh mét biÓu thøc

th«ng thêng, dêng nh nã ë bªn ngoµi x©u. Nã kh«ng ph¶i lµ biÕn ®îc xen lÉn tríc hÕt. Nãi c¸ch kh¸c, nÕu $y chøa x©u 2*4 th× ta vÉn nãi vÒ phÇn tö 1, chø kh«ng ph¶i lµ 7, v× 2*4 xem nh mét sè (gi¸ trÞ cña $y ®îc dïng trong biÓu thøc sè) chØ lµ 2 râ.

NÕu b¹n muèn ®Æt sau mét tham kh¶o biÕn v« híng ®¬n dÊu ngoÆc vu«ng tr¸i th× b¹n cÇn ®Þnh biªn cho dÊu ngoÆc vu«ng ®Ó cho nã kh«ng ®îc coi nh mét phÇn cña mét tham kh¶o m¶ng, nh sau:

@fred = (“hello”, “dolly”); # ®Æt gi¸ trÞ cho @fred ®Ó kiÓm thö

$fred = “right”;# chóng ta ®ang ®Þnh nãi “this is right[1]”...$x = “this is $fred[1]”; # sai, cho “this is dolly”$x = “this is ${fred}[1]” ; # ®óng (®îc b¶o vÖ bëi dÊu

ngoÆc nhän)$x = “this is $fred.”.”[1]”; # ®óng (x©u kh¸c)$x = “this is $fred\[1]”; # ®óng (sæ chÐo ngîc che dÊu nã)T¬ng tù, mét danh s¸ch c¸c gi¸ trÞ tõ mét biÕn m¶ng còng

cã thÓ ®îc xen lÉn. ViÖc xen lÉn ®¬n gi¶n nhÊt lµ toµn bé m¶ng, ®îc chØ ra b»ng viÖc cho tªn m¶ng (kÓ c¶ kÝ tù @ ®øng ®Çu cña nã). Trong trêng hîp nµy, c¸c phÇn tö ®îc xen lÉn theo tr×nh tù víi mét dÊu c¸ch gi÷a chóng, nh trong:

@fred = (“a”, “bb”, “ccc”, 1, 2, 3);$all = “Now for @fred here!”;

# $all cho “Now for a bb ccc 1 2 3 here!”

Page 70: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

B¹n còng cã thÓ chän ra mét phÇn cña m¶ng víi l¸t c¾t:@fred = (“a”, “bb”, “ccc”, 1,2,3);$all = “Now for @fred[2,3] here!”;

# $all cho “Now for ccc 1 here!”$all = “Now for @fred[@fred[4,5]] here!”; # còng thÕMét lÇn n÷a, b¹n cã thÓ dïng bÊt k× c¬ chÕ nh¸y kÐp nµo

®· ®îc m« t¶ tríc ®©y nÕu b¹n muèn ®Æt sau mét tham kh¶o tªn m¶ng b»ng mét h»ng kÝ hiÖu dÊu ngoÆc nhän tr¸i thay v× mét biÓu thøc chØ sè.Bµi tËpXem Phô lôc A vÒ lêi gi¶i1. H·y viÕt mét ch¬ng tr×nh ®äc mét danh s¸ch c¸c x©u vµ in

ra danh s¸ch theo thø tù ®¶o ngîc.2. H·y viÕt mét ch¬ng tr×nh ®äc mét sè råi mét danh s¸ch c¸c

x©u (tÊt c¶ ®Òu trªn c¸c dßng t¸ch biÖt), råi in mét trong c¸c dßng ®ã tõ danh s¸ch nh ®îc lùa chän bëi con sè ®ã.

3. H·y viÕt mét ch¬ng tr×nh ®äc mét danh s¸ch c¸c x©u råi cän ra vµ in x©u ngÉu nhiªn trong danh s¸ch ®ã. H·y chän mét phÇn tö ngÉu nhiªn cña @somearray , ®Æt srand; t¹i ®Çu ch¬ng tr×nh cña b¹n (®iÒu nµy sÏ khëi ®Çu bé sinh sè ngÉu nhiªn), vµ råi dïng rand (@somearray) khi b¹n cÇn mét gi¸ trÞ ngÉu nhiªn gi÷a 0 vµ mét sè bÐ h¬n chiÒu dµi cña @somearray.

Page 71: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

4

CÊu tróc

®iÒu khiÓn

Khèi c©u lÖnhKhèi c©u lÖnh lµ mét dÉy c¸c c©u lÖnh, ®îc bao trong cÆp

dÊu ngoÆc nhän. Nã tr«ng tùa nh thÕ nµy:{

c©u lÖnh thø nhÊt;c©u lÖnh thø hai;c©u lÖnh thø ba;...c©u lÖnh cuèi;

}Perl thùc hiÖn tõng c©u lÖnh theo tr×nh tù, tõ ®Çu ®Õn

cuèi. (VÒ sau, t«i sÏ chØ cho b¹n c¸ch thay ®æi tr×nh tù thùc hiÖn nµy bªn trong khèi, nhng hiÖn t¹i th× thÕ lµ ®ñ.)

VÒ mÆt có ph¸p, mét khèi c¸c c©u lÖnh ®îc chÊp nhËn ë mäi vÞ trÝ cña mét c©u lÖnh.C©u lÖnh if/unless

§é phøc t¹p tiÕp theo trong c¸c c©u lÖnh lµ c©u lÖnh if. KÕt cÊu nµy tr«ng rÊt gièng kÕt cÊu trong C: mét biÓu thøc ®iÒu khiÓn (®îc tÝnh theo tÝnh ®óng ®¾n cña nã), vµ hai khèi. Nãi c¸ch kh¸c, nã tr«ng tùa nh thÕ nµy:

if (biÓu thøc nµo ®ã) {c©u lÖnh 1 trong trêng hîp ®óng ;c©u lÖnh 2 trong trêng hîp ®óng ;c©u lÖnh 3 trong trêng hîp ®óng ;

} else {c©u lÖnh 1 trong trêng hîp sai ;c©u lÖnh 2 trong trêng hîp sai ;c©u lÖnh 3 trong trêng hîp sai ;

}(NÕu b¹n thµnh th¹o vÒ C th× b¹n sÏ chó ý r»ng c¸c dÊu

Trong ch¬ng nµy: Khèi c©u

lÖnh C©u lÖnh if /

unless C©u lÖnh

while / until C©u lÖnh for

Page 72: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

ngoÆc nhän lµ cÇn thiÕt. §iÒu nµy khö bá nhu cÇu vÒ qui t¾c “else lßng thßng”.)

Trong khi thùc hiÖn, Perl sÏ tÝnh biÓu thøc ®iÒu khiÓn. NÕu biÓu thøc nµy lµ ®óng th× khèi thø nhÊt (c¸c c©u lÖnh trong trêng hîp ®óng trªn) sÏ ®îc thôc hiÖn. NÕu biÓu thøc lµ sai th× khèi thø hai (c¸c c©u lÖnh trong trêng hîp sai trªn) sÏ ®îc thùc hiÖn.

Nhng ®óng sai lµ nh thÕ nµo? Trong Perl, c¸c qui t¾c cã ®«i chót h¬i huyÒn ¶o, nhng chóng cho b¹n kÕt qu¶ nh dù kiÕn. BiÓu thøc ®iÒu khiÓn ®wojc tÝnh cho mét gi¸ trÞ x©u (nÕu nã ®· lµ x©u, th× ch¼ng cã thay ®æi g×, nhng nÕu nã lµ sè th× nã sÏ ®îc chuyÓn thµnh x©u* ). NÕu x©u nµy hoÆc lµ x©u rçng (chiÒu dµi kh«ng), hoÆc lµ mét x©u cã chøa mét kÝ tù “0” (kh«ng), th× gi¸ trÞ cña biÓu thøc lµ sai. Mäi thø kh¸c ®Òu ®îc tù ®éng coi nh lµ ®óng. T¹i sao l¹i cã c¸i qui t¾c buån cêi nµy vËy? V× ®iÒu Êy lµm cho dÔ dµng nhÈy theo c¸i rçng* so víi mét x©u kh¸c rçng, còng nh sè kh«ng so víi sè kh¸c kh«ng, kh«ng cÇn ph¶i t¹o ra hai c¸ch hiÓu vÒ c¸c gi¸ trÞ ®óng vµ sai. Sau ®©y lµ nh÷ng thÝ dô vÒ c¸ch hiÓu ®óng vµ sai:

0 # chuyÓn thµnh “0”, cho nªn lµ sai1-1 # chuyÓn thµnh 0, råi chuyÓn thµnh “0”, cho nªn lµ sai1 # chuyÓn thµnh “1”, nªn lµ ®óng“” # x©u rçng, cho nªn lµ sai“1” # khong ph¶i lµ “” hay “0”, cho nªn ®óng“00” # kh«ng ph¶i lµ “” hay “0”, cho nªn lµ ®óng (trêng

hîp nµy cã huyÒn ¶o, xem mµ xem)“0.000” # còng ®óng víi cïng lÝ do vµ c¶nh b¸oundef # tÝnh thµnh “”, cho nªn saiVÒ mÆt thùc hµnh mµ nãi, c¸ch hiÓu c¸c gi¸ trÞ ®óng sai

th× kh¸ trùc gi¸c. §õng ®Ó t«i lµm b¹n sî.Sau ®©y lµ mét thÝ dô vÒ c©u lÖnh if ®Çy ®ñ:print “B¹n bao nhiªu tuæi råi?”$a = <STDIN>;chop($a);if ($a < 18) {

print “Nµy, b¹n cha ®ñ tuæi bÇu cö ®©u nhÐ, Êy?\n”;} else {

print “§ñ tuæi råi! H·y b×nh th¶n! VËy ®i bÇu cö ®i!\n”;$voter++; # ®Õm sè cö tri vÒ sau

* Bªn trong, ®iÒu nµy kh«ng hoµn toµn ®óng. Nhng nã hµnh ®éng gièng nh ®©y lµ ®iÒu nã thùc hiÖn.* Nµy, rçng lµ ngo¹i trõ cho trêng hîp bÖnh ho¹n cña mét kÝ tù kh«ng ®Êy

Page 73: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}B¹n cã thÓ c¾t bá khèi else, chØ ®Ó l¹i phÇn then, nh trong:print “B¹n bao nhiªu tuæi råi?”$a = <STDIN>;chop($a);if ($a < 18) {

print “Nµy, b¹n cha ®ñ tuæi bÇu cö ®©u nhÐ, Êy?\n”;}§«i khi, b¹n muèn bá ®i phÇn then mµ chØ cã phÇn else, v×

sÏ tù nhiªn h¬n ®Ó nãi “h·y lµm ®iÒu ®ã nÕu ®iÒu nµy sai,” so víi “lµm ®iÒu ®ã nÕu ®iÒu kh«ng ®iÒu nµy lµ ®óng.” Perl gi¶i quyÕt ®iÒu nµy víi biÕn thÓ unless:

print “B¹n bao nhiªu tuæi råi?”$a = <STDIN>;chop($a);unless ($a < 18) {

print “§ñ tuæi råi! H·y b×nh th¶n! VËy ®i bÇu cö ®i!\n”;$voter++;

}ViÖc thay thÕ if b»ng unless lµ cã hiÖu qu¶ khi nãi “NÕu

biÓu thøc ®iÒu khiÓn lµ kh«ng ®óng th× h·y lµm...” (mét unless còng cã thÓ cã mét else, nh if.)

NÕu b¹n cã nhiÒu h¬n hai chän lùa th× b¹n cã thÓ thªm mét nh¸nh elsif vµo c©u lÖnh if , gièng nh:

if (biÓu thøc mét nµo ®ã) {c©u lÖnh 1 trong trêng hîp ®óng mét;c©u lÖnh 2 trong trêng hîp ®óng mét;c©u lÖnh 3 trong trêng hîp ®óng mét;

} elsif (biÓu thøc hai nµo ®ã ) {c©u lÖnh 1 trong trêng hîp ®óng hai;c©u lÖnh 2 trong trêng hîp ®óng hai;c©u lÖnh 3 trong trêng hîp ®óng hai;

} elsif (biÓu thøc ba nµo ®ã ){c©u lÖnh 1 trong trêng hîp ®óng ba;c©u lÖnh 2 trong trêng hîp ®óng ba;c©u lÖnh 3 trong trêng hîp ®óng ba;

} else {c©u lÖnh 1 trong trêng hîp sai tÊt c¶ ;c©u lÖnh 2 trong trêng hîp sai tÊt c¶;c©u lÖnh 3 trong trêng hîp sai tÊt c¶;

}

Page 74: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Mçi biÓu thøc (ë ®©y, biÓu thøc mét nµo ®ã, biÓu thøc hai nµo ®ã, vµ biÓu thøc ba nµo ®ã) ®Òu ®îc tÝnh lÇn lît. NÕu mét biÓu thøc lµ ®óng th× nh¸nh t¬ng øng sÏ ®îc thùc hiÖn, vµ tÊt c¶ phÇn cßn l¹i cña biÓu thøc ®iÒu khiÓn còng c¸c nh¸nh c©u lÖnh sÏ bÞ bá qua. NÕu tÊt c¶ c¸c biÓu thøc nµy ®Òu sai th× nh¸nh else sÏ ®îc thùc hiÖn (nÕu cã). B¹n cã thÓ cã nhiÒu nh¸nh elsif tuú ý.C©u lÖnh while/until

Kh«ng mét ng«n ng÷ thuËt to¸n nµo l¹i hoµn chØnh mµ kh«ng cã mét d¹ng lÆp nµo ®ã (thùc hiÖn lÆp l¹i mét khèi c¸c c©u lÖnh). Perl cã thÓ lÆp b»ng viÖc dïng c©u lÖnh while:

while (biÓu thøc nµo ®ã) {c©u lÖnh 1;c©u lÖnh 2;c©u lÖnh 3;

}§Ó thùuc hiÖn c©u lÖnh while nµy, Perl tÝnh biÓu thøc ®iÒu

khiÓn (biÓu thøc nµo ®ã trong thÝ dô nµy). NÕu gi¸ trÞ nµy lµ ®óng (b»ng viÖc dïng ý tëng vÒ c¸i ®óng cña c©u lÖnh if), th× th©n cña c©u lÖnh while sÏ ®îc tÝnh mét lÇn. §iÒu nµy ®îc lÆp l¹i cho tíi khi biÓu thøc ®iÒu khiÓn trë thµnh sai, t¹i ®iÓm ®ã Perl chuyÓn sang c©u lÖnh tiÕp sau while. Ch¼ng h¹n:

print “B¹n bao nhiªu tuæi råi?”$a = <STDIN>;chop($a);while ($a > 0) {

print “Vµo lóc nµy b¹n míi $a tuæi.\n”;$a--;

}§«i khi nãi “h·y lµm viÖc ®ã trong khi ®iÒu nµy sai” l¹i dÔ

h¬n lµ nãi “h·y lµm viÖc ®ã trong khi kh«ng ®iÒu nµy lµ ®óng.” Mét lÇn n÷a, Perl l¹i cã c©u tr¶ lêi. Thay cho while lµ until, còng cho kÕt qu¶ mong muèn:

until (biÓu thøc nµo ®ã) {c©u lÖnh 1;c©u lÖnh 2;c©u lÖnh 3;

}Chó ý r»ng trong c¶ hai d¹ng while vµ until, c¸c c©u lÖnh

th©n sÏ bÞ bá qua hoµn toµn nÕu biÓu thøc ®iÒu khiÓn lµ gi¸ trÞ kÕt thóc nagy tõ lóc b¾t ®Çu. Ch¼ng h¹n, nÕu ngêi dïng ®-

Page 75: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

a vµo mét ®é tuæi bÐ h¬n kh«ng cho ®o¹n ch¬ng tr×nh trªn th× Perl sÏ bá qua th©n chu tr×nh.

Cã thÓ lµ biÓu thøc ®iÒu khiÓn sÏ ch¼ng bao giê ®Ó cho chu tr×nh ra ®îc. §iÒu nµy hoµn toµn hîp ph¸p, vµ ®«i khi còng lµ mong muèn n÷a, vµ do vËy kh«ng bÞ coi nh mét lçi. Ch¼ng h¹n, b¹n cã thÓ muèn mét chu tr×nh cø lÆp l¹i m·i chõng nµo b¹n cßn cha ph¹m ph¶i lçi, vµ råi cã mét ®o¹n tr×nh gi¶i quyÕt lçi ®i theo sau chu tr×nh. B¹n cã thÓ dïng ®iÒu nµy cho mét viÖc qu¸i quØ cø thÕ ch¹y hoµi cho tíi khi hÖ thèng sËp.C©u lÖnh for

Mét kÕt cÊu lÆp kh¸c cña Perl lµ c©u lÖnh for, mµ trong gièng nh c©u lÖnh for cña C, vµ lµm viÖc th× ®¹i thÓ còng gièng thÕ. Sau ®©y lµ nã:

for (biÓu thøc khëi ®Çu; biÓu thøc kiÓm tra; biÓu thøc t¨ng) {

c©u lÖnh 1;c©u lÖnh 2;c©u lÖnh 3;

}Gì ra theo d¹ng ta ®· thÊy tríc ®©y, ®iÒu nµy trë thµnhbiÓu thøc khëi ®Çuwhile (biÓu thøc kiÓm tra) {

c©u lÖnh 1;c©u lÖnh 2;c©u lÖnh 3;biÓu thøc t¨ng

}Trong c¶ hai trêng hîp, biÓu thøc khëi ®Çu ®Òu ®îc tÝnh tr-

íc. BiÓu thøc nµy vÒ ®iÓn h×nh chØ g¸n gi¸ trÞ ban ®Çu cho mét biÕn lÆp, nhng còng ch¼ng cã h¹n chÕ nµo vÒ viÖc nã cã thÓ chøa c¸i g× - trong thùc tÕ nã cã thÓ rçng (ch¼ng lµm g× c¶). Råi biÓu thøc kiÓm tra sÏ ®îc tÝnh ®Ó x¸c ®Þnh ®óng sai. NÕu gi¸ trÞ tÝnh ®îc lµ ®óng th× th©n chu tr×nh sÏ ®îc tÝnh, tiÕp theo ®ã lµ tÝnh biÓu thøc t¨ng (mµ ®iÓn h×nh lµ ®îc dïng ®Ó t¨ng bé lÆp). Perl tiÕp ®ã sÏ tÝnh l¹i biÓu thøc kiÓm tra, lÆp l¹i khi cßn cÇn.

ThÝ dô nµy in ra c¸c sè tõ 1 ®Õn 10, mçi sè ®Òu cã sau nã mét dÊu c¸ch:

for ($i = 1; $i <= 10; $i++)print “$i “;

Page 76: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}Ban ®Çu, biÕn $i ®îc ®Æt lµ 1. Råi, biÕn nµy ®îc so s¸nh víi

10, mµ thùc sù nã ®ang bÐ h¬n hay b»ng. Th©n cña chu tr×nh (mçi c©u lÖnh print) ®îc thùc hiÖn, vµ råi biÓu thøc t¨ng (biÓu thøc tù t¨ng $i++) sÏ ®îc thùc hiÖn, thay ®æi gi¸ trÞ trong $i thµnh 2. V× ®iÒu nµy vÉn cßn bÐ h¬n 10 nªn ta lÆp l¹i tiÕn tr×nh, cho tíi khi lÇn lÆp cuèi mµ gi¸ trÞ 10 cña $i ®æi thµnh 11. Råi ®iÒu nµy kh«ng cßn bÐ h¬n hay b»ng 10 n÷a, cho nªn chu tr×nh ®i ra (víi $i cã gi¸ trÞ 11).C©u lÖnh foreach

VÉn cßn mét kÕt cÊu lÆp kh¸c lµ c©u lÖnh foreach. C©u lÖnh nµy rÊt gièng nh c©u lÖnh foreach cña vá C: nã nhËn mét danh s¸ch c¸c gi¸ trÞ vµ mçi lÇn l¹i g¸n chóng cho mét biÕn v« híng, råi thùc hiÖn mét khèi m· cïng víi viÖc g¸n ®ã. Nã tr«ng tùa nh thÕ nµy:

foreach $i (@danh s¸ch nµo ®ã) {c©u lÖnh 1;c©u lÖnh 2;c©u lÖnh 3;

}Kh«ng gièng líp vá C, gi¸ trÞ nguyªn gèc cña biÕn v« híng ®-

îc tù ®éng kh«i phôc khi chu tr×nh ®i ra - mét c¸ch kh¸c ®Ó nãi ®iÒu nµy lµ ë chç biÕn v« híng lµ côc bé cho chu tr×nh.

Sau ®©y lµ mét thÝ dô vÒ foreach:@a = (1,2,3,4,5);foreach $b (reverse @a) {

print $b;}MÈu ch¬ng tr×nh nµy in ra 54321. Chó ý r»ng danh s¸ch ®îc

foreach sö dông cã thÓ lµ mét biÓu thøc danh s¸ch bÊt k×, kh«ng chØ lµ mét biÕn m¶ng. (§©y lµ ®iÓn h×nh cho phÇn lín c¸c kÕt cÊu Perl cã yªu cÇu mét danh s¸ch.)

B¹n cã thÓ bá tªn cña biÕn v« híng, trong trêng hîp ®ã Perl gi¶ thiÕt r»ng b¹n ®· x¸c ®Þnh dïng tªn biÕn $_. B¹n sÏ thÊy r»ng biÕn $_ ®îc dïng nh mÆc ®Þnh cho nhiÒu phÐp to¸n Perl, cho nªn b¹n cã thÓ coi nã nh mét vïng nh¸p. (TÊt c¶ c¸c phÐp to¸n cã dïng $_ theo mÆc ®Þnh còng ®Òu cã thÓ dïng mét biÕn v« híng th«ng thêng.) Ch¼ng h¹n, to¸n tö print in ra gi¸ trÞ cña $_ nÕu kh«ng cã gi¸ trÞ nµo kh¸c ®îc x¸c ®Þnh, cho nªn thÝ dô sau ®©y sÏ lµ mviÖc nh thÝ dô tríc:

Page 77: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

@a = (1,2,3,4,5);foreach (reverse @a) {

print ;}B¹n xem viÖc dïng biÕn $_ lµm ®¬n gi¶n h¬n bao nhiªu

kh«ng? (Hay Ýt nhÊt th× còng ng¾n h¬n.)NÕu danh s¸ch mµ b¹n ®ang lÆp ®îc t¹o nªn tõ mét tham

kh¶o biÕn m¶ng ®¬n, thay v× mét to¸n tö nµo ®ã mµ cho l¹i mét gi¸ trÞ danh s¸ch, th× biÕn v« híng ®ang ®îc dïng cho lÆp trong thùc tÕ l¹i lµ tham kh¶o tíi tõng phÇn tö cña m¶ng ®ã, thay v× lµ b¶n sao cña c¸c gi¸ trÞ ®ã. §iÒu nµy ngô ý g× theo nghÜa th«ng thêng? Nã cã nghÜa lµ nÕu b¹n thay ®æi biÕn v« híng th× b¹n còng thay ®æi phÇn tö ®Æc biÖt trong m¶ng mµ biÕn ®ã ®ang ®¹i diÖn cho. Ch¼ng h¹n:

@a = (3,5,7,9);foreach $one ($a) {

$one *= 3;}# @a b©y giê lµ (9, 15,21,27)B¹n h·y chó ý ®Õn viÖc thay ®æi $one trong thùc tÕ lµm

thay ®æi tõng phÇn tö cña @a. Bµi tËp

Xem Phô lôc A vÒ lêi gi¶i.1. H·y viÕt mét ch¬ng tr×nh hái vÒ nhiÖt ®é bªn ngoµi, råi in

“qu¸ nãng” nÕu nhiÖt ®é lµ trªn 72 F, vµ “qu¸ l¹nh” trong cadc trêng hîp kh¸c.

2. H·y söa ®æi ch¬ng tr×nh trong bµi tËp tríc ®Ó cho nã in ra “qu¸ nãng” nÕu nhiÖt ®é lµ trªn 75F, “qu¸ l¹nh” nÕu nhiÖt ®é lµ díi 68F, vµ “võa ph¶i” nÕu nhiÖt ®é trong kho¶ng 68 vµ 75.

3. H·y viÕt mét ch¬ng tr×nh ®äc mét danh s¸ch c¸c sè (mçi sè mét hµng) cho tíi khi ®äc tíi sè 999, råi in ra toµn bé tÊt c¶ c¸c sè ®· céng l¹i víi nhau. (Ph¶i ch¾c ®õng cã céng c¶ 999 vµo!) Ch¼ng h¹n, nÕu b¹n ®a vµo 1,2,3 vµ 999 th× ch¬ng tr×nh sÏ ®¸p øng víi c©u tr¶ lêi 6 (1+2+3).

4. H·y viÕt mét ch¬ng tr×nh ®äc mét danh s¸ch c¸c x©u råi in chóng ra thµnh danh s¸ch c¸c x©u theo thø tù ®¶o ngîc (kh«ng dïng to¸n tö reverse cho danh s¸ch). (Nhí r»ng to¸n tö <STDIN> sÏ ®äc mét danh s¸ch c¸c x©u trªn tõng dßng t¸ch biÖt khi ®îc dïng trong hoµn c¶nh m¶ng.)

Page 78: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

5. H·y viÕt mét ch¬ng tr×nh in ra b¶ng c¸c sè vµ b×nh ph¬ng cña chóng tõ kh«ng ®Õn 32. H·y thö ®a ra mét c¸ch mµ b¹n kh«ng cÇn ph¶i cã tÊt c¶ c¸c sè tõ 0 ®Õn 32 trong danh s¸ch, råi thö mét c¸ch b¹n ph¶i cã c¸c sè ®ã. (§Ó tr«ng cho ®Ñp,printf “%5g %8g\n”, $a, $bsÏ in ra $a vµ $b nh mét sè cã n¨m cét, cßn $b nh mét sè cã t¸m cét.

Page 79: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

5

M¶ng kÕt hîp

M¶ng kÕt hîp lµ g×?M¶ng kÕt hîp còng tùa nh m¶ng (kiÓu danh s¸ch) mµ ta ®·

th¶o luËn tríc ®©y, trong ®ã nã lµ mét tuyÓn tËp c¸c d÷ liÖu v« híng, víi c¸c phÇn tö riªng ®îc chän ra b»ng mét gi¸ trÞ chØ sè nµo ®ã. Kh«ng gièng m¶ng danh s¸ch, gi¸ trÞ chØ sè cña m¶ng kÕt hîp kh«ng ph¶i lµ sè nguyªn kh«ng ©m nhá, mµ thay vµo ®ã lµ v« híng tuú ý. Nh÷ng v« híng nµy (cßn gäi lµ kho¸) ®îc dïng vÒ sau ®Ó t×m kiÕm c¸c gi¸ trÞ tõ m¶ng nµy.

C¸c phÇn tö cña m¶ng kÕt hîp kh«ng cã thø tù ®Æc biÖt. B¹n h·y xem chóng tùa nh bµn ®Çy nh÷ng qu©n bµi. Nöa trªn cña c¸c con bµi lµ kho¸, cßn nöa díi lµ gi¸ trÞ cña chóng. Mçi lÇn b¹n ®Æt mét gi¸ trÞ vµo trong m¶ng kÕt hîp th× mét con bµi míi l¹i ®îc t¹o ra. VÒ sau khi b¹n muèn söa ®æi gi¸ trÞ nµy, b¹n cho kho¸, cßn Perl t×m ra ®óng con bµi. Cho nªn, thùc sù, trËt tù cña c¸c con bµi lµ kh«ng quan träng. Trong thùc tÕ, Perl cÊt gi÷ c¸c con bµi (cÆp kho¸-gi¸ trÞ) theo thø tù bªn trong ®Æc biÖt ®Ó dÔ dµng t×m ra mét con bµi ®Æc biÖt, cho nªn Perl kh«ng ph¶i duyÖt qua tÊt c¶ c¸c cÆp ®Ó t×m ra ®óng con bµi. B¹n kh«ng thÓ kiÓm so¸t ®îc trËt tù nµy, cho nªn ®õng cã thö.BiÕn m¶ng kÕt hîp

Tªn biÕn m¶ng kÕt hîp lµ dÊu phÇn tr¨m (%) theo sau bëi mét ch÷, theo sau n÷a lµ kh«ng hay nhiÒu ch÷, ch÷ sè vµ dÊu g¹ch thÊp. Nãi c¸ch kh¸c, phÇn ®i sau dÊu phÇn tr¨m gièng hÖt c¸i mµ chóng ta cã cho tªn biÕn v« híng vµ biÕn m¶ng. Vµ gièng nh ch¼ng cã quan hÖ g× gi÷a $fred vµ @fred, biÕn m¶ng kÕt hîp %fred còng ch¼ng liªn quan g× tíi hai lo¹i biÕn kia c¶.

Thay v× tham kh¶o tíi toµn bé m¶ng kÕt hîp, th«ng dông

Trong ch¬ng nµy: M¶ng kÕt hîp

lµ g×? BiÕn m¶ng kÕt

hîp BiÓu diÔn h»ng

cho m¶ng kÕt hîp

Page 80: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

h¬n c¶ lµ ta t¹o ra mét m¶ng kÕt hîp vµ th©m nhËp vµo nã b»ng c¸ch tham kh¶o tíi c¸c phÇn tö cña nã. Mçi phÇn tö cña m¶ng ®Òu lµ mét v« híng t¸ch biÖt, ®îc th©m nhËp tíi bëi mét chØ môc v« híng, gäi lµ kho¸. C¸c phÇn tö cña m¶ng kÕt hîp %fred vËy ®îc tham kh¶o ®Õn b»ng $fred{$key} víi $key lµ bÊt k× biÓu thøc v« híng nµo. L¹i chó ý r»ng viÖc th©m nhËp vµo mét phÇn tö cña m¶ng kh«ng b¾t ®Çu b»ng cïng chç ng¾t nh tªn cña toµn bé m¶ng.

Gièng nh víi m¶ng danh s¸ch, b¹n cã thÓ t¹o ra nh÷ng phÇn tö míi b»ng viÖc g¸n cho m¶ng mét phÇn tö:

$fred{“aaa”} = “bbb” ; # t¹o ra kho¸ “aaa”, gi¸ trÞ “bbb”$fred{234.5} = 456.7; # t¹o ra kho¸ “234.5”, gi¸ trÞ 456.7Hai c©u lÖnh nµy t¹o ra hai phÇn tö trong m¶ng. Nh÷ng

tham kh¶o vÒ sau tíi cïng nh÷ng phÇn tö nµy (dïng cïng kho¸) sÏ cho l¹i gi¸ trÞ ®îc cÊt gi÷.

print $fred{“aaa”}; # in “bbb”$fred{234.5} += 3; # lµm cho nã thµnh 459.7ViÖc tham kh¶o tíi mét phÇn tö kh«ng cã s½n sÏ cho l¹i gi¸

trÞ undef, gièng nh víi m¶ng danh s¸ch hay biÕn v« híng kh«ng x¸c ®Þnh.BiÓu diÔn h»ng kÝ hiÖu cho m¶ng kÕt hîp

B¹n cã thÓ muèn th©m nhËp vµo m¶ng kÕt hîp nh mét toµn thÓ, ®Ó hoÆ khëi ®Çu nã hay sao chÐp nã sang m¶ng kÕt hîp kh¸c. Perl kh«ng thùc sù cã biÓu diÔn h»ng kÝ hiÖu cho m¶ng kÕt hîp, cho nªn thay v× thÕ nã th¸o rêi m¶ng ra nh mét danh s¸ch. Mçi cÆp phÇn tö trong danh s¸ch (mµ bao giê còng ph¶i cã mét sè ch½n phÇn tö) ®Òu x¸c ®Þnh ra mét kho¸ vµ gi¸ trÞ t¬ng øng cña nã. BiÓu diÔn th¸o rêi nµy cã thÓ ®îc g¸n vµo trong m¶ng kÕt hîp kh¸c, mµ råi sÏ t¸i t¹o l¹i cïng m¶ng kÕt hîp ®ã. Nãi c¸ch kh¸c:

@fred_list = %fred;# @fred_list nhËn (“aaa”, “bbb”, “234.5”, 456.7)%barney = @fred_list; # t¹o ra %barney gièng %fred%barney = %fred; # c¸ch nhanh h¬n ®Ó lµm cïng viÖc ®ã%smooth = (“aaa”, “bbb”, “234.5”, 456.7);# t¹o ra %smooth gièng nh %fred, tõ c¸c gi¸ trÞ h»ng kÝ

hiÖuTrËt tù cña c¸c cÆp kho¸-gi¸ trÞ lµ tuú ý trong c¸ch biÓu

diÔn th¸o rêi nµy, vµ kh«ng thÓ kiÓm so¸t ®îc. Cho dï b¹n cã tr¸o ®æi mét sè gi¸ trÞ vµ t¹o ra mét m¶ng nh mét toµn thÓ

Page 81: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

th× danh s¸ch th¸o rêi thu ®îc vÉn cø theo bÊt k× trËt tù nµo mµ Perl ®· t¹o ra ®Ó th©m nhËp hiÖu qu¶ vµo c¸c phÇn tö riªng. B¹n ®õng bao giê nªn dùa trªn bÊt k× trËt tù ®Æc biÖt nµo.C¸c to¸n tö m¶ng kÕt hîp

Sau ®©y lµ mét sè to¸n tö cho m¶ng kÕt hîp.To¸n tö keys()

To¸n tö keys(%tªn m¶ng) cho l¹i danh s¸ch c¸c tÊt c¶ c¸c kho¸ hiÖn cã trong m¶ng kÕt hîp %tªn m¶ng . Nãi c¸ch kh¸c, nã tùa nh c¸c phÇn tö ®îc ®¸nh sè lÎ (mét, ba n¨m v©n v©n) cña danh s¸ch ®îc viÖc th¸o rêi %tªn m¶ng cho l¹i trong ng÷ c¶nh m¶ng, vµ trong thùc tÕ, cho l¹i chóng theo trËt tù ®ã. NÕu kh«ng cã phÇn tö nµo trong m¶ng kÕt hîp th× keys() cho l¹i mét danh s¸ch rçng.

Ch¼ng h¹n, b»ng viÖc dïng m¶ng kÕt hîp tõ thÝ dô tríc:$fred{“aaa”} = “bbb”;$fred{234.5} = 456.7;@list = keys(%fred) ; # @list nhËn ®îc (“aaa”, 234.5) hay

(234.5, “aaa”)C¸c dÊu ngoÆc trßn lµ tuú chän: keys %fred còng gièng nh

keys(%fred).foreach $key (key %fred) {# mét lÇn cho mçi kho¸ cña

%fredprint “t¹i $key chóng ta cã $fred{$key}\n”; # in kho¸ vµ

gi¸ trÞ }ThÝ dô nµy còng chØ ra r»ng c¸c phÇn tö m¶ng kÕt hîp cã

thÓ chen lÉn nhau trong c¸c x©u nh¸y kÐp. Tuy nhiªn b¹n kh«ng thÓ xen lÉn toµn bé m¶ng* .

Trong ng÷ c¶nh v« híng, to¸n tö keys() cho l¹i sè c¸c phÇn tö (cÆp kho¸-gi¸ trÞ) trong m¶ng kÕt hîp. Ch¼ng h¹n, b¹n cã thÓ t×m ra liÖu m¶ng kÕt hîp cã rçng hay kh«ng:

if (keys(%m¶ng nµo ®ã)) { # nÕu keys() kh¸c kh«ng:...; # m¶ng lµ kh¸c rçng

}# ... hoÆc ...while (keys(%m¶ng nµo ®ã) < 10) {

* Nµy, b¹n cã thÓ ®Êy, b»ng c¸ch dïng l¸t c¾t, nhng chóng ta kh«ng nãi vÒ l¸t c¾t ë ®©y.

Page 82: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

... ; # cø lÆp chu tr×nh khi ta cã Ýt h¬n 10 phÇn tö}

To¸n tö values()To¸n tö values(%tªn m¶ng) cho l¹i mét danh s¸ch tÊt c¶ c¸c

gi¸ trÞ hiÖn t¹i cña %tªn m¶ng, theo cïng trËt tù nh c¸c kho¸ ®îc to¸n tö keys(%tªn m¶ng) cho l¹i. Nh víi keys(), c¸c dÊu ngoÆc trßn lµ tuú chän. Ch¼ng h¹n:

%lastname = (); # buéc %lastname lµ rçng$lastname(“fred”} = “flintstore”;$lastname{“barney”} = “rubble”;@lastname = values(%lastname); # lÊy c¸c gi¸ trÞT¹i ®iÓm nµy @lastname chøa hoÆc (“flintstore”, “rubble”)

hay ®¶o ngîc cña nã.To¸n tö each()

NÕu b¹n muèn lÆp trªn (tøc lµ xem xÐt mäi phÇn tö cña) toµn bé m¶ng kÕt hîp, th× b¹n cã thÓ dïng keys(), duyÖt xÐt tõng kho¸ ®îc cho l¹i vµ nhËn gi¸ trÞ t¬ng øng. Trong khi ph¬ng ph¸p nµy thêng hay ®îc dïng, mét c¸ch hiÖu qu¶ h¬n lµ dïng each(%tªn m¶ng), to¸n tö sÏ cho l¹i cÆp kho¸-gi¸ trÞ nh mét danh s¸ch hai phÇn tö. Víi mçi lÇn thùc hiÖn to¸n tö nµy cho cïng m¶ng, cÆp kho¸-gi¸ trÞ kÕ tiÕp sÏ ®îc cho l¹i, cho tíi khi tÊt c¶ c¸c phÇn tö ®Òu ®· ®îc th©m nhËp tíi. Khi kh«ng cßn cÆp nµo n÷a th× each() cho l¹imét danh s¸ch rçng.

VËy ch¼ng h¹n, ®Ó bíc qua m¶ng %lastname trong thÝ dô tríc, h·y lµm ®iÒu g× ®ã tùa nh thÕ nµy:

while (($first, $last) = each(%lastname)) {print “Tªn cuèi cïng cña $first lµ $last\n”;

}ViÖc g¸n mét gi¸ trÞ míi cho toµn bé m¶ng sÏ ®Æt l¹i tõng

to¸n tö each() cho tõ ®Çu. ViÖc bæ sung hay lo¹i bá c¸c phÇn tö cña m¶ng th× rÊt cã thÓ g©y ra lÉn lén each() (vµ cã thÓ g©y lÉn lén cho c¶ b¹n n÷a).To¸n tö delete

Cho ®Õn giê, víi ®iÒu b¹n biÕt ®îc, b¹n cã thÓ thªm phÇn tö vµo m¶ng kÕt hîp, nhng b¹n kh«ng thÓ lo¹i bá chóng (mét viÖc kh¸c h¬n lµ g¸n gi¸ trÞ míi cho toµn bé m¶ng). Perl cung cÊp to¸n tö delete ®Ó lo¹i bá c¸c phÇn tö. To¸n h¹ng cña delete lµ mét tham kh¶o m¶ng kÕt hîp, hÖt nh nÕu b¹n chØ nh×n vµo

Page 83: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

mét gi¸ trÞ ®Æc biÖt. Perl lo¹i bá cÆp kho¸-gi¸ trÞ khái m¶ng kÕt hîp, vµ cho l¹i gi¸ trÞ cña phÇn tö bÞ xo¸. Ch¼ng h¹n:

%fred = (“aaa”, “bbb”, 234.5, 34.56) ; # cho %fred 2 phÇn tö

delete $fred{“aaa”};# %fred b©y giê chØ cßn mét cÆp kho¸-gi¸ trÞ

Bµi tËpXem phô lôc A vÒ lêi gi¶i.

1. H·y viÕt mét ch¬ng tr×nh ®äc vµ in mét x©u vµ gi¸ trÞ ¸nh x¹ cña nã t¬ng øng víi ¸nh x¹ ®îc tr×nh bÇy trong b¶ng sau:

C¸i vµo C¸i ra®á lôcxanh

t¸ol¸®¹i d¬ng

2. H·y viÕt mét ch¬ng tr×nh ®äc mét chuçi c¸c tõ víi mét tõ

trªn dßng cho tíi cuèi tÖp, råi in ra mét tãm t¾t cã bao nhiªu lÇn mçi tõ ®· gÆp. (Thªm mét th¸ch thøc, h·y s¾p xÕp c¸c tõ theo thø tù gi¶m dÇn m· ASCII khi ®a ra.)

Page 84: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

6

Vµo / ra c¬ b¶n

Vµo tõ STDINViÖc ®äc tõ lèi vµo chuÈn (qua bé khiÓn gi¶i Perl ®îc gäi lµ

STDIN) th× thËt dÔ dµng. Chóng ta ®· lµm viÖc nµy víi to¸n tö <STDIN>. ViÖc tÝnh to¸n tö nµy trong ng÷ c¶nh v« híng cho b¹n mét dßng tiÕp cña c¸i vµo, hay undef nÕu kh«ng cßn dßng nµo n÷a, gièng nh:

$a = <STDIN>; # ®äc dßng tiÕpViÖc tÝnh to¸n tö nµy trong ng÷ c¶nh m¶ng sÏ cho b¹n tÊt c¶

c¸c dßng cßn l¹i nh mét danh s¸ch - mçi phÇn tö cña danh s¸ch nµy lµ mét dßng, bao gåm c¸c kÕt thóc dßng míi cña nã. Chóng ta ®· thÊy ®iÒu nµy tríc ®©y, nhng xem nh viÖc lµm míi l¹i, nã cã thÓ tr«ng nh mét c¸i g× ®ã tùa nh thÕ nµy:

@a = <STDIN>;Mét c¸ch ®iÓn h×nh, mét trong nh÷ng ®iÒu b¹n muèn lµm

lµ ®äc tÊt c¶ c¸c dßng mét lóc, vµ lµm ®iÒu g× ®ã trªn mçi dßng. Mét c¸ch chung ®Ó lµm ®iÒu nµy lµ:

while ($_ = <STDIN>) {# xö lÝ $_ t¹i ®©y (cho tõng dßng)

}Cø mçi khi mét dßng ®îc ®äc vµo, <STDIN> l¹i cho mét gi¸

trÞ ®óng* , cho nªn chu tr×nh tiÕp tôc thùc hiÖn. Khi <STDIN> kh«ng cßn dßng nµo ®Ó ®äc n÷a th× nã cho l¹i undef , cho gi¸ trÞ sai, kÕt thóc chu tr×nh.

ViÖc ®äc mét gi¸ trÞ v« híng cho <STDIN> vµ dïng gi¸ trÞ ®ã lµm biÓu thøc ®iÒu khiÓn cho chu tr×nh (nh trong thÝ dô tríc) thêng hay xu¸at hiÖn ®Õn møc Perl cã h¼n mét c¸hc viÕt t¾t cho nã. BÊt k× khi nµo viÖc kiÓm thö chu tr×nh chØ bao gåm mét to¸n tö ®a vµo (c¸i g× ®ã tùa nh <...>), th× Perl tù ®éng sao dßng ®îc ®äc vµo trong biÕn $_.* NÕu dßng cuèi cïng cña tÖp chØ cã m«t jksi tù “0” th× <STDIN> cho l¹i undef t¹i dßng ®ã; thay v× t¹i cuèi tÖp. NÕu b¹n t¹o ra mét tÖp gièng nh thÕ th× ngêi lËp tr×nh Perl trªn toµn thÕ giíi sÏ göi cho b¹n th giËn dçi. Nhng ®ã lµ mét tÖp bÖnh ho¹n lµm ph¸ vì viÖc dïng lo¹i chu tr×nh nµy.

Trong ch¬ng nµy:Vµo tõ STDINVµo tõ to¸n tö Diamond§a ra STDOUT

Page 85: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

while ($_ = <STDIN>) { # gièng “while ($_ = <STDIN>)”chop; # gièng “chop($_)”# c¸c phÐp to¸n kh¸c víi $_ ë ®©y

}V× biÕn $_ lµ mÆc ®Þnh cho nhiÒu phÐp to¸n nªn b¹n cã

thÓ tiÕt kiÖm kh¸ nhiÒu vÒ viÖc gâ theo c¸ch nµy.§a vµo tõ to¸n tö h×nh thoi

Mét c¸ch kh¸c ®Ó ®äc c¸i vµo lµ dïng to¸n tö h×nh thoi: <>. To¸n tö nµy gièng nh <STDIN> ë chç nã cho l¹i mét dßng riªng lÎ trong ng÷ c¶nh v« híng (víi undef nÕu tÊt c¶ c¸c dßng nµy ®· ®îc ®äc), hay tÊt c¶ c¸c dßng cßn l¹i nÕu ®îc dïng trong ng÷ c¶nh m¶ng. Tuy nhiªn, kh¸c víi <STDIN>, to¸n tö h×nh thoi lÊy d÷ liÖu tõ tÖp hay c¸c tÖp ®îc x¸c ®Þnh trªn dßng lÖnh ®îc gäi trong ch¬ng tr×nh Perl. Ch¼ng h¹n, nÕu b¹n cã mét ch¬ng tr×nh mang tªn kitty, bao gåm:

#! /usr/bin/perlwhile (<>) {

print $_;}vµ nÕu b¹n gäi kitty víi:kitty file1 file2 file3

th× to¸n tö h×nh thoi sÏ ®äc tõng dßng cña file1 theo sau bëi tõng dßng cña file2 vµ file3 lÇn lît, cho l¹i undef khØ khi tÊt c¶ c¸c dßng ®· ®îc ®äc hÕt. Nh b¹n cã thÓ thÊy, kitty lµm viÖc gièng nh cat, göi tÊt c¶ c¸c dßng cña tÖp cã tªn ra lèi ra chuÈn theo tuÇn tù. NÕu, gièng cat, b¹n kh«ng x¸c ®Þnh bÊt k× tªn tÖp nµo trªn dßng lÖnh th× to¸n tö h×nh thoi sÏ tù ®éng ®äc tõ lèi vµo chuÈn.

VÒ mÆt kÜ thuËt, to¸n tö h×nh thoi kh«ng nh×n y nguyªn vµo c¸c ®èi dßng lÖnh - nã lµm viÖc tõ m¶ng @ARGV. M¶ng nµy lµ mét m¶ng ®Æc biÖt ®îc bé th«ng dÞch Perl ®Æt s½n lµ mét danh s¸ch c¸c ®èi dßng lÖnh. Mçi ®èi dßng lÖnh l¹i bÞ bá ®i sau khi Perl ®· lÊy c¸c chuyÓn m¹ch dßng lÖnh cña nã ®Ó ®a vµo mét phÇn tö t¸ch biÖt cña m¶ng @ARGV. B¹n cã thÓ hiÓu danh s¸ch nµy theo bÊt k× c¸ch nµo b¹n muèn*. B¹n thËm chÝ cã thÓ ®Æt m¶ng nµy bªn trong ch¬ng tr×nh cña m×nh, vµ cã to¸n tö h×nh thoi lµm viÖc trªn danh s¸ch míi thay v× c¸c ®èi dßng lÖnh, nh thÕ nµy:* Th viÖn chuÈn cña Perl chøa c¸c tr×nh cho viÖc ph©n tÝch kiÓu nh getop cho c¸c ®èi dßng lÖnh cña ch¬ng tr×nh Perl. Xam S¸ch con lõa ®Ó biÕt thªm th«ng tin vÒ th viÖc nµy.

Page 86: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

@ARGV = (“aaa”, “bbb”, “ccc”);while (<>) { # xö lÝ tÖp aaa, bbb vµ ccc

print “Dßng nµy lµ: $_”;}Trong Ch¬ng 10, Gi¶i quyÕt tÖp vµ kiÓm thö tÖp, chóng ta

sÏ thÊy c¸ch më vµ ®ãng c¸c tÖp x¸c ®Þnh vµo thêi ®iÓm x¸c ®Þnh, nhng kÜ thuËt nµy ®· ®îc dïng cho mét sè ch¬ng tr×nh nhanh-vµ-bÈn cña t«i.§a ra STDOUT

Perl dïng c¸c to¸n tö print vµ printf ®Ó ghi lªn lèi ra chuÈn. Ta h·y xem c¸ch chóng ®îc dïng.Dïng print cho ®a ra th«ng thêng

Chóng ta ®· dïng print ®Ó hiÓn thÞ v¨n b¶n lªn lèi ra chuÈn. Ta h·y më réng thªm mét chót.

To¸n tö print nhËn mét danh s¸ch c¸c x©u, vµ göi lÇn lît tõng x©u ra lèi ra chuÈn, kh«ng can thiÖp hay thªm c¸c kÝ tù vµo ®u«i. §iÒu cã thÓ kh«ng hiÓn nhiªn lµ ë chç print thùc sù chØ lµ to¸n tö danh s¸ch, vµ cho l¹i mét gi¸ trÞ gièng nh bÊt k× to¸n tö danh s¸ch nµo kh¸c. Nãi c¸ch kh¸c:

$a = print (“xin chµo”, “mäi ngêi”, “\n”) ;sÏ lµ mét c¸ch kh¸c ®Ó nãi xin chµo mäi ngêi. Gi¸ trÞ cho l¹i cña print lµ mét gi¸ trÞ ®óng hay sai, chØ ra sù thµnh c«ng cña viÖc in. Nã gÇn nh bao giê còng thµnh c«ng, trõ phi b¹n gÆp lçi vµo/ra nµo ®ã, cho nªn $a trong trêng hîp nµy sÏ gÇn nh bao giê còng lµ 1.

§«i khi, b¹n sÏ cÇn bæ sung thªm c¸c dÊu ngoÆc vµo print nh ®îc nªu trong thÝ dô nµy, ®Æc biÖt nÕu ®iÒu ®Çu tiªn b¹n muèn in b¾t ®Çu víi mét dÊu më ngoÆc trßn, nh trong:

print (2+3), “xin chµo”; # sai! in 5, bá qua “xin chµo’print ((2+3), “xin chµo”); # ®óng! in 5xin chµoprint 2+3, “xin chµo”; # còng ®óng! in 5xin chµo

Dïng printf cho c¸i ra cã ®Þnh d¹ngB¹n cã thÓ muèn cã mét chót Ýt kiÓm so¸t víi c¸i ra h¬n lµ

kh¶ n¨ng print cung cÊp. Trong thùc tÕ, b¹n cã thÓ quen víi c¸i ra cã ®Þnh d¹ng cña hµm printf cña C. Chí cã sî - Perl cung cÊp mét phÐp to¸n t¬ng øng víi cïng tªn.

To¸n tö printf nhËn mét danh s¸ch ®èi (®îc bao trong dÊu ngoÆc trßn tuú chän, nh to¸n tö print). §èi thø nhÊt lµ mét x©u

Page 87: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

kiÓm so¸t ®Þnh d¹ng, x¸c ®Þnh c¸ch in c¸c ®èi cßn l¹i. NÕu b¹n cßn cha quen thuéc víi hµm printf chuÈn, th× b¹n nªn kiÓm tra xem l¹i hµm printf. Tuy nhiªn, xem nh mét thÝ dô:

printf “%15s %5d %10.2f\n”, $s, $n, $r;sÏ in ra $s trong mét trêng 15 kÝ tù, råi ®Õn dÊu c¸ch, råi

®Õn $n xem nh mét sè nguyªn trong trêng 5 kÝ tù, rßi ®Õn m«t jdÊu c¸ch kh¸c, ®Õn $r nh gi¸ trÞ dÊu phÈy ®éng víi 2 vÞ trÝ thËp ph©n trong mét trêng 10 kÝ tù, vµ cuèi cïng lµ mét dÊu dßng míi.Bµi tËp

Xem Phô lôc A vÒ lêi gi¶i.1. H·y viÕt mét ch¬ng tr×nh hµnh ®éng nh cat, nhng ®¶o ngîc

thø tù c¸c dßng. (Mét sè hÖ thèng cã tiÖn Ých kiÓu nh vËy mang tªn tac.)

2. H·y viÕt mét ch¬ng tr×nh ®äc mét danh s¸ch c¸c x©u råi in ra x©u trong mét cét cã c¨n lÒ ph¶i 20 kÝ tù. Ch¼ng h¹n, ®a vµo xin chµo, t¹m biÖt in ra xin chµo vµ t¹m biÖt ®îc c¨n lÒ ph¶i trong cét 20 kÝ tù.

3. H·y söa ®æi ch¬ng tr×nh cña bµi tËp tríc ®Ó cho phÐp ngêi dïng chän lÊy chiÒu réng cét. Ch¼ng h¹n, ®a vµo 20, xin chµo vµ t¹m biÖt còng lµm cïng viÖc nh ch¬ng tr×nh tríc ®· lµm, nhng ®a vµo 30, xin chµo vµ t¹m biÖt th× ph¶i c¨n lÒ xin chµo vµ t¹m biÖt theo cét 30 kÝ tù.

Page 88: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

7

BiÓu thøc

chÝnh qui

Kh¸i niÖm vÒ biÓu thøc chÝnh quiBiÓu thøc chÝnh qui lµ mét khu«n mÉu - mét tiªu b¶n - ®Ó

®îc s¸nh víi mét x©u. ViÖc s¸nh mét biÓu thøc chÝnh qui víi mét x©u th× hoÆc thµnh c«ng hoÆc thÊt b¹i. §«i khi, sù thµnh c«ng hay thÊt b¹i nµy cã thÓ lµ tÊt c¶ nh÷ng g× b¹n quan t©m tíi. Vµo lóc kh¸c, b¹n sÏ muèn lÊy mét khu«n mÉu ®· s¸nh ®óng vµ thay thÕ nã b»ng mét x©u kh¸c, mét phÇn trong ®ã cã thÓ phô thuéc ®Ých x¸c vµo c¸ch thøc vµ n¬i chèn mµ biÓu thøc chÝnh qui ®îc s¸nh ®óng.

BiÓu thøc chÝnh qui thêng ®îc nhiÒu ch¬ng tr×nh UNIX dïng tíi, nh grep, sed, awk, ed, vi, emacs vµ thËm chÝ c¶ nhiÒu vá n÷a. mçi ch¬ng tr×nh ®Òu cã mét tËp c¸c kÝ tù tiªu b¶n kh¸c nhau (phÇn lín lµ chêm lªn nhau). Perl lµ mét siªu tÖp ng÷ nghÜa cho tÊt c¶ nh÷ng c«ng cô nµy - bÊt k× biÓu thøc chÝnh qui nµo mµ cã thÓ ®îc viÕt trong mét trong nh÷ng c«ng cô UNIX nµy th× còng ®Òu cã thÓ ®îc viÕt trong Perl, nhng kh«ng nhÊt thiÕt dïng hÖt c¸c kÝ tù ®ã.C¸ch dïng ®¬n gi¶n vÒ biÓu thøc chÝnh qui

NÕu chóng ta t×m tÊt c¶ c¸c dßng cña mét tÖp cã chøa x©u abc, th× ta cã thÓ dïng chØ lÖnh grep:

grep abc sonefile > resultTrong trêng hîp nµy, abc lµ biÓu thøc chÝnh qui mµ chØ

lÖnh grep lÊy ®Ó kiÓm tra cho tõng dßng ®a vµo. Nh÷ng dßng s¸n h®óng sÏ ®îc chuyÓn ra lèi ra chuÈn (ë ®©y, kÕt thóc víi tÖp result v× viÖc chuyÓn híng cña vá).

Trong Perl, ta cã thÓ nãi vÒ x©u abc nh biÓu thøc chÝnh qui b»ng viÖc bao x©u nµy trong hai dÊu sæ chÐo:

if (/abc/) {print “$_”;

Trong ch¬ng nµy: 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

Khu«n mÉu Thªm vÒ to¸n tö

®èi s¸nh PhÐp thÕ To¸n tö split()

vµ join()

Page 89: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}Nhng c¸i g× ®îc kiÓm tra so víi biÓu thøc chÝnh qui abc

trong trêng hîp nµy? T¹i sao, anh b¹n cò cña chóng ta, biÕn $_ l¹i cã mÆt ë ®©y? Khi mét biÓu thøc chÝnh qui ®îc bao trong hai dÊu sæ chÐo (nh trªn), th× biÕn $_ sÏ ®îc kiÓm tra theo biÓu thøc chÝnh qui ®ã. NÕu biÓu thøc chÝnh qui s¸nh ®óng, th× to¸n tö s¸nh sÏ cho l¹i gi¸ trÞ ®óng. Ngoµi ra, nã cho l¹i gi¸ trÞ sai.

Trong thÝ dô nµy, biÕn $_ ®îc gi¶ sö cã chøa mét dßng v¨n b¶n nµo ®ã, vµ ®îc in ra nÕu dßng nµy cã chøa c¸c kÝ tù abc ®©u ®ã bªn trong dßng - t¬ng tù nh chØ lÖnh grep ë trªn. Kh«ng gièng nh chØ lÖnh grep, vèn vËn hµnh trªn tÊt c¶ c¸c dßng cña tÖp, ®o¹n ch¬ng tr×nh Perl nµy chØ nh×n vµo cã mét dßng th«i. §Ó lµm viÖc trªn tÊt c¶ c¸c dßng, ta cÇn thªm vµo mét chu tr×nh, nh trong:

while (<>) {if (/abc/) {

print “$_”;}

}§iÒu g× sÏ x¶y ra nªu nh ta kh«ng biÕt ®îc sè cña c¸c b gi÷a

a vµ c? Tøc lµ, ®iÒu g× sÏ x¶y ra nÕu ta muèn in dßng cã chøa mét a vµ theo sau nã lµ kh«ng hay nhiÒu b, råi theo sau n÷a lµ mét c? Víi grep, ta ph¶i nãi:

grep “ab*c” somefile > result(§èi nµy cã chøa dÊu sao trong ngoÆc kÐp bëi v× chóng ta

kh«ng muèn líp vá tr¶i réng ®èi ®ã cø nh lµ mét mÉu tªn tÖp. Nã ph¶i ®îc truyÒn qua grep ®Ó cã hiÖu qu¶.) ThÕ mµ trong Perl, chóng ta cã thÓ nãi ®Ých x¸c cïng ®iÒu ®ã:

while (<>) {if (/ab*c/) {

print “$_”;}

}Còng hÖt nh grep, ®iÒu nµy cã nghÜa lµ mét a theo sau bëi

kh«ng hay nhiÒu b, theo sau lµ c.Chóng ta sÏ xem xÐt nhiÒu tuú chän kh¸c vÒ to¸n tö ®èi

s¸nh trong môc “Nãi thªm vÒ to¸n tö ®èi s¸nh”, ë cuèi ch¬ng nµy, sau khi ta ®· nãi vÒ tÊt c¶ c¸c lo¹i biÓu thøc chÝnh qui.

Mét to¸n tö biÓu thøc chÝnh qui n÷a lµ to¸n tö thay thÕ, lµm viÖc thay thÕ mét phÇn cña x©u mµ s¸nh ®óng biÓu thøc

Page 90: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

chÝnh qui b»ng mét x©u kh¸c. To¸n tö thay thÕ gièng nh chØ lÖnh s trong sed, bao gåm mét ch÷ s, mét sæ chÐo, mét biÓu thøc chÝnh qui, mét sæ chÐo, mét x©u thay thÕ, vµ mét sæ chÐo cuèi cïng, tr«ng tùa nh thÕ nµy:

s/ab*c/def/;X©u (trong trêng hîp nµy lµ biÕn $_) ®îc ®em ra ®èi s¸nh

víi biÓu thøc chÝnh qui (ab*c). NÕu viÖc ®èi s¸nh thµnh c«ng, th× phÇn cña x©u s¸n h®óng sÏ bÞ lo¹i ra vµ ®îc thay thÕ b»ng x©u thay thÕ (def). NÕu viÖc ®èi s¸nh kh«ng thµnh c«ng th× ch¼ng cã g× x¶y ra c¶.

Nh víi to¸n tö ®èi s¸nh, ta sÏ cßn xem xÐt l¹i v« sè c¸c tuú chän vÒ to¸n tö thay thÕ díi ®©y, trong môc “Thay thÕ”.

Khu«n mÉuMét biÓu thøc chÝnh qui lµ mét khu«n mÉu. Mét sè phÇn cña

khu«n mÉu s¸nh ®óng chØ c¸c kÝ tù trong x©u thuéc kiÓu ®Æc biÖt. Nh÷ng phÇn kh¸c cña khu«n mÉu s¸nh ®óng cho ®a kÝ tù, hay ®a ®a kÝ tù. Tríc hÕt, ta sÏ xem c¸c khu«n mÉu mét kÝ tù, råi ®Õn c¸c khu«n mÉu ®a kÝ tù.Khu«n mÉu mét kÝ tù

KÝ tù s¸nh mÉu ®¬n gi¶n nhÊt vµ th«ng dông nhÊt trong c¸c biÓu thøc chÝnh qui lµ mét kÝ tù s¸nh víi chÝnh nã. Nãi c¸ch kh¸c, ®Æt mét ch÷ a vµo trong biÓu thøc chÝnh qui ®ßi hái mét ch÷ t¬ng øng a trong x©u.

KÝ tù s¸nh mÉu th«ng dông nhÊt tiÕp ®ã lµ dÊu chÊm “.”. DÊu chÊm ®èi s¸nh bÊt k× kÝ tù riªng lÎ nµo ngo¹i trõ dÊu dßng míi (\n). Ch¼ng h¹n, khu«n mÉu /a./ ®èi s¸nh bÊt k× d·y hai kÝ tù nµo b¾t ®Çu b»ng a vµ kh«ng ph¶i lµ “a\n”.

Líp kÝ tù s¸nh mÉu ®îc biÓu diÔn bëi cÆp dÊu ngoÆc vu«ng më vµ ®ãng, vµ mét danh s¸ch c¸c kÝ tù n»m gi÷a hai dÊu ngoÆc nµy. Mét vµ chØ mét trong c¸c kÝ tù nµy ph¶i hiÖn diÖn t¹i phÇn t¬ng øng cña x©u cÇn s¸nh mÉu. Ch¼ng h¹n,

/[abcde]/s¸nh víi bÊt k× mét trong n¨m ch÷ ®Çu tiªn cña b¶ng ch÷

thêng, trong khi/[aeiouAEIOU]/l¹i s¸nh víi bÊt k× n¨m nguyªn ©m hoÆc ch÷ thêng

hoÆcch÷ hoa. NÕu b¹n muèn ®Æt dÊu ngoÆc vu«ng ph¶i (])

Page 91: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

vµo danh s¸ch th× h·y ®Æt mét sæ chÐo ngîc ë tríc nã, hay ®Æt nã nh kÝ tù ®Çu tiªn bªn trong danh s¸ch. Ph¹m vi cña c¸c kÝ tù (nh a tíi z0 cã thÓ ®îc viÕt t¾t b»ng viÖc chØ ra nh÷ng ®iÓm cuèi cña ph¹m vi ®îc t¸ch biÖt bëi dÊu g¹ch ngang (-); ®Ó cã ®îc h»ng kÝ hiÖu g¹ch ngang, b¹n h·y ®Æt tríc dÊu g¹ch ngang mét sæ chÐo ngîc. Sau ®©y lµ mét sè thÝ dô kh¸c:

[0123456789] # s¸nh víi mäi ch÷ sè[0-9] # còng thÕ[0-9\-] # s¸nh 0-9 hay dÊu trõ[a-z0-9] # s¸nh bÊt k× ch÷ thêng hay sè nµo[a-zA-Z0-9_] # s¸nh bÊt k× ch÷, sè hay dÊu g¹ch thÊpCòng cã líp kÝ tù bÞ phñ ®Þnh, còng lµ cïng líp kÝ tù, nhng

cã thªm dÊu mòi tªn ngîc (hay dÊu mò ^) ®»ng tríc, ®i ngay sau dÊu ngoÆc tr¸i. Líp kÝ tù nµy ®èi s¸nh víi bÊt k× kÝ tù ®¬n nµo kh«ng trong danh s¸ch. Ch¼ng h¹n:

[^0-9] # s¸nh víi bÊt k× kÝ tù phi sè nµo[^aeiouyAEIOUY] # s¸nh víi bÊt k× kÝ tù nµo kh«ng nguyªn

©m[^\^] # s¸nh víi mét kÝ tù ®¬n trõ mòi tªn ngîc§Ó tiÖn cho b¹n, ®· cã ®Þnh nghÜa s½n mét sè líp ksi tù

chung, nh ®îc m« t¶ trong B¶ng 7-1.

B¶ng 7-1: ViÕt t¾t cho líp kÝ tù ®Þnh s½nKÕt cÊu

Líp t-¬ng ®-

¬ng

KÕt cÊu phñ

®Þnh

Líp phñ ®Þnh t-¬ng ®-

¬ng\d (sè) [0-9] \D (sè,

kh«ng!)[^0-9]

\w (tõ) [a-zA-Z0-9_]

\W (tõ, kh«ng!)

[^a-zA-Z0-9_]

\s (c¸ch)

[ \r\t\n\f] \S (c¸ch, kh«ng!)

[^ \r\t\n\f]

Khu«n mÉu \d s¸nh víi “sè”. Khu«n mÉu \w s¸nh víi “kÝ tù tõ”, mÆc dÇu ®iÒu thùc sù s¸nh ®óng lµ bÊt k× c¸i g× hîp lÖ trong tªn biÕn Perl. Khu«n mÉu \s s¸nh víi “dÊu c¸ch” (kho¶ng tr¾ng), ë ®©y ®îc x¸c ®Þnh nh dÊu c¸ch, vÒ ®Çu dßng

Page 92: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

(kh«ng hay dïng mÊy trong UNIX), tab, xuèng dßng (dÊu dßng míi cña UNIX), vµ kÐo giÊy. C¸c b¶n ch÷ hoa s¸nh ®óng víi c¸i ®èi lËp cho nh÷ng líp nµy.Khu«n mÉu nhãm

Søc m¹nh thùc sù cña biÓu thøc chÝnh qui lµ khi b¹n cã thÓ nãi “mét hay nhiÒu nh÷ng thø nµy” hay “cho tíi n¨m thø nµy”. Ta h·y nãi vÒ c¸ch thùc hiÖn ®iÒu nµy.

D·yKhu«n mÉu nhãm ®Çu tiªn (vµ cã lÏ kÐm hiÓn nhiªn nhÊt) lµ

d·y. §iÒu nµy cã nghÜa lµ abc s¸nh ®óng víi mét a theo sau lµ b, theo sau lµ c. Nã dêng nh ®¬n gi¶n, nhng t«i cø ®Æt tªn cho nã ®Ó t«i cã thÓ nãi vÒ nã sau nµy.

BéiChóng ta ®· thÊy dÊu sao (*) nh mét khu«n mÉu nhãm. DÊu

sao chØ ra r»ng “kh«ng hay nhiÒu” kÝ tù (hay líp kÝ tù) ®øng ngay tríc nã.

Hai khu«n mÉu nhãm kh¸c lµm viÖc gièng thÕ lµ dÊu céng (+), nghÜa lµ “mét hay nhiÒu” kÝ tù ®øng nagy tríc, vµ dÊu hái (?), nghÜa lµ “kh«ng hay mét” kÝ tù ngay tríc. Ch¼ng h¹n, biÓu thøc chÝnh qui /fo+ba?r/ s¸nh ®óng cho mét f theo sau lµ mét hay nhiÒu o, theo sau lµ a, b vµ tuú chän a, theo sau lµ mét r.

Trong tÊt c¶ ba khu«n mÉu nhãm nµy, c¸c khu«n mÉu ®Òu tham lam. NÕu mét khu«n mÉu nh vËy cã c¬ héi s¸nh ®óng gi÷a n¨m vµ mêi kÝ tù th× nã sÏ läc ra x©u mêi kÝ tù mçi lóc. Ch¼ng h¹n:

$_ = “fred xxxxxxxxxx barney”;s/x*/boom/;bao giê còng thay tÊt c¶ c¸c x liªn tiÕp b»ng boom (kÕt qu¶

lµ fred boom barney), thay v× chØ thay thÕ cho mét hay hai x, cho dï mét tËp x ng¾n h¬n còng s¸nh ®îc cho cïng biÓu thøc chÝnh qui

NÕu b¹n cÇn nãi “n¨m tíi mêi” x, th× b¹n cã thÓ xoay xë b»ng c¸ch ®Æt n¨m x theo sau bëi n¨m x n÷a ®i liÒn sau dÊu chÊm hái. Nhng lµm thÕ tr«ng xÊu, mµ còng ch¼ng lµm viÖc tèt l¾m. Thay v× vËy, cã mét c¸ch dÔ h¬n: sè béi tæng qu¸t. Sè béi tæng qu¸t bao gåm mét cÆp dÊu ngoÆc nhän víi mét hay hai sè bªn trong, nh trong /x{5,10}/. Gièng nh ba sè béi kh¸c, kÝ tù ®øng ngay tríc (trong trêng hîp nµy lµ ch÷ “x”) ph¶i ®îc t×m thÊy bªn trong sè lÇn lÆp ®· chØ ra (n¨m ®Õn mêi ë ®©y).

Page 93: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

NÕu b¹n bá ®i con sè thø hai, nh trong /x{5,}/, th× ®iÒu nµy cã nghÜa lµ “nhiÒu hay h¬n n÷a” (n¨m hay nhiÒu h¬n trong trêng hîp nµy), vµ nÕu b¹n bá nèt dÊu phÈy, nh trong /x{5}/, th× ®iÒu ®ã cã nghÜa lµ “®óng con sè nµy” (n¨m x). §Ó ®îc 5 x hay Ýt h¬n, b¹n ph¶i ®Æt sè kh«ng vµo, nh trong /x{0,5}/.

VËy, biÓu thøc chÝnh qui /a.{5}b/ s¸nh ®óng cho kÝ tù a ®-îc t¸ch víi ksi tù b bëi bÊt k× n¨m kÝ tù kh¸c kÝ tù dßng míi. (Nhí l¹i r»ng dÊu chÊm s¸nh víi bÊt k× kÝ tù kh¸c dÊu dßng míi, vµ chóng ta s¸nh víi n¨m kÝ tù nh thÕ ë ®©y.) N¨m kÝ tù nµy kh«ng cÇn ph¶i nh nhau. (Chóng ta sÏ biÕt c¸ch ®Ó buéc chóng lµ nh nhau trong môc tiÕp.)

Ta cã thÓ miÔn trõ hoµn toµn b»ng *, +, vµ ?, v× chóng hoµn toµn t¬ng ®¬ng víi {0,}, {1,}, vµ {0,1}. Nhng dÔ dµng h¬n vÉn lµ gâ mét kÝ tù ng¾t t¬ng ®¬ng, mµ còng quen thuéc h¬n.

NÕu cã hai sè béi trong mét biÓu thøc, th× qui t¾c tham lam ®îc t¨ng lªn víi “bªn tr¸i nhÊt lµ tham nhÊt”. Ch¼ng h¹n:

$_ = “a xxx c xxxxxxx d”;/a.*c.*d/;Trong trêng hîp nµy, “.*” thø nhÊt trong biÓu thøc chÝnh qui

s¸nh víi tÊt c¶ c¸c kÝ tù cho tíi c thø hai, cho dï viÖc s¸nh ®óng chØ víi c¸c kÝ tù cho tíi c ®Çu tiªn vÉn cho phÐp toµn bé biÓu thøc chÝnh qui ®îc s¸nh. §iÒu nµy kh«ng t¹o ra kh¸c biÖt g× (khu«n mÉu sÏ s¸nh theo c¶ hai c¸ch), nhng sau nµy khi chóng ta cã thÓ nh×n vµo c¸c bé phËn cña biÓu thøc chÝnh qui mµ ®-îc s¸nh, th× sÏ cã ®«i chót vÊn ®Ò.

§iÒu g× x¶y ra nÕu biÓu thøc x©u vµ chÝnh qui h¬i bÞ thay ®æi ®i, ch¼ng h¹n nh:

$_ = “a xxx ce xxxxxxx ci xxx d”;/a.*ce.*d/;Trong trêng hîp nµy, nÕu .* s¸nh víi phÇn lín c¸c kÝ tù cã thÓ

tríc c tiÕp, th× kÝ tù biÓu thøc chÝnh qui tiÕp (e) sÏ kh«ng s¸nh víi kÝ tù tiÕp cña x©u (i). Trong trêng hîp nµy, ta thu ®îc viÖc lÇn ngîc tù ®éng - sè béi bÞ th¸o ra vµ thö l¹i, dõng l¹i t¹i chç nµo ®ã phÝa tríc (trong trêng hîp nµy, t¹i c tríc, tiÕp sau lµ (e)* . Mét biÓu thøc chÝnh qui phøc t¹p cã thÓ bao gåm nhiÒu møc lÇn ngîc nh vËy, dÉn tíi thêi gian thùc hiÖn l©u.

* VÒ mÆt kÜ thuËt, cã nhiÒu c¸ch lÇn ngîc cña to¸n tö * ®Ó t×m ra c ë vÞ trÝ ®Çu tiªn. Nhng ph¶i h¬i thñ thuËt h¬n ®Ó m« t¶ nã, mµ nã vÉn ho¹t ®éng theo cïng nguyªn lÝ.

Page 94: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

DÊu ngoÆc trßn nh bé nhíMét to¸n tö nhãm kh¸c lµ cÆp më vµ ®ãng ngoÆc trßn

quanh bÊt k× phÇn khu«n mÉu nµo. §iÒu nµy kh«ng lµm thay ®æi liÖu khu«n mÉu cã s¸nh ®óng hay kh«ng, nhng thay v× thÕ l¹i lµm cho mét phÇn cña x©u ®îc khu«n mÉu s¸nh ®óng sÏ ®îc ghi nhí, ®Ó cho nã cã thÓ ®îc tham kh¶o tíi vÒ sau. VËy ch¼ng h¹n, (a) vÉn s¸nh víi a, cßn ([a-z]) th× vÉn s¸nh víi bÊt k× ch÷ thêng nµo.

§Ó nhí l¹i mét phÇn ®· ghi nhí cña mét x©u, b¹n ph¶i ®a vµo mét d¸u sæ chÐo ngîc theo sau bëi mét sè nguyªn. KÕt cÊu khu«n mÉu nµy biÓu thÞ cho cïng d·y c¸c kÝ tù ®îc s¸nh tríc ®©y trong cÆp dÊu ngoÆc trßn cïng sè (®Õm tõ mét) . Ch¼ng h¹n:

/fred(.)barney\1/;s¸nh mét x©u cã chøa fred, tiÕp theo lµ mét kÝ kh¸c dÊu

dßng míi, tiÕp n÷a lµ barney, råi tiÕp bëi cïng mét kÝ tù ®ã. VËy, nã s¸nh víi fredxbarneyx, nhng kh«ng s¸nh víi fredxbarneyy. B¹n h·y so s¸nh ®iÒu ®ã víi:

/fred.barney./’trong ®ã hai kÝ tù kh«ng x¸c ®Þnh cã thÓ lµ mét, hay kh¸c

nhau - còng ch¼ng thµnh vÊn ®Ò g×.Sè 1 ®Õn tõ ®©u vËy? Nã cã nghÜa lµ phÇn biÓu thøc

chÝnh qui n»m trong dÊu ngoÆc ®Çu tiªn. NÕu cã nhiÒu phÇn nh thÕ, th× phÇn thø hai (®Õm c¸c dÊu ngÆc tr¸i tõ tr¸i sang ph¶i) sÏ ®îc tham kh¶o tíi lµ \2, phÇn thø ba lµ \3, vµ cø thÕ. Ch¼ng h¹n:

/a(.)b(.)c\2d\1/;sÏ s¸nh víi mét a, mét kÝ tù (gäi nã lµ #1), mét b, mét kÝ tù

kh¸c (gäi nã lµ #2), mét c, kÝ tù #2, mét d, vµ kÝ tù #1. Cho nªn nã s¸nh víi axbycydx, ch¼ng h¹n.

PhÇn ®îc tham kh¶o tíi cã thÓ nhiÒu h¬n mét kÝ tù. Ch¼ng h¹n:

/a(.*)b\1c/;s¸nh víi mét a, theo sau bëi mét sè bÊt k× kÝ tù nµo (thËm

chÝ kh«ng), theo sau bëi b, theo sau bëi cïng d·y kÝ tù ®ã, theo sau bëi c. VËy, nã sÏ s¸nh víi aFREDnFREDc, hay thËm chÝ abc, nhng kh«ng aXXbXXXc.

Mét c¸ch dïng kh¸c cña phÇn ®îc nhí cña biÓu thøc chÝnh qui lµ trong x©u thay thÕ cña chØ lÖnh thay thÕ. KÕt cÊu

Page 95: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

kiÓu \1 vÉn gi÷ gi¸ trÞ cña chóng trong x©u thay thÕ, vµ cã thÓ ®îc tham kh¶o tíi ®Ó x©y dùng x©u, nh trong:

$_ = “a xxx b yyy c zzz d”;s/b(.*)c/d\1e/;mµ sÏ thay thÕ b vµ c b»ng d vµ e, vÉn gi÷ l¹i phÇn ë gi÷a.Thay phiªnMét kÕt cÊu nhãm kh¸c lµ thay phiªn, nh trong a|b|c. §iÒu

nµy cã nghÜa lµ s¸nh ®óng mét trong c¸c kh¶ n¨ng (a hay b hay c trong trêng hîp nµy). §iÒu nµy vÉn cã t¸c dông ngay c¶ khi c¸c thay phiªn cã nhiÒu kÝ tù, nh trong /song|blue/, sÏ s¸nh hoÆc song hoÆc blue. (Víi nh÷ng thay phiªn ®¬n gi¶n, tèt h¬n c¶ lµ b¹n cã thÓ bá líp kÝ tù nh /[abc]/.)

§iÒu g× x¶y ra nÕu ta muèn s¸nh songbird hay bluebird? Ta cã thÓ viÕt /songbird|bluebird/, nhng phÇn bird ®ã kh«ng nªn cã ®ã hai lÇn. Trong thùc tÕ, còng cã c¸ch ra, nhng ta ph¶i nãi tíi thø tù u tiªn cho c¸c khu«n mÉu nhãm, sÏ ®îc ®Ò cËp tíi trong môc “Thø tù u tiªn” díi ®©y.Khu«n mÉu neo

Bèn kÝ ph¸p ®Æc biÖt ®ãng neo cho mét khu«n mÉu. Th«ng thêng, khi mét khu«n mÉu ®îc s¸nh víi x©u th× sù b¾t ®Çu cña khu«n mÉu ®ã ®îc rª ®i trong toµn bé x©u tõ tr¸i sang ph¶i, s¸nh víi c¬ héi cã thÓ ®Çu tiªn. Neo còng cho phÐp b¹n ®¶m b¶o r»ng c¸c phÇn cña dßng khu«n mÉu s¾p th¼ng víi nh÷ng phÇn ®Æc biÖt cña x©u.

CÆp neo thø nhÊt ®ßi hái r»ng mét phÇn ®Æc biÖt cña viÖc ®èi s¸nh ph¶i ®îc ®Þnh vÞ t¹i biªn giíi tõ hay kh«ng t¹i biªn giíi tõ. Neo \b yªu cÇu mét biªn giíi tõ t¹i ®iÓm ®· chØ ra cho khu«n mÉu ®èi s¸nh. Biªn giíi tõ lµ n¬i ë gi÷a c¸c kÝ tù s¸nh víi \w vµ \W, hay gi÷a c¸c kÝ tù s¸nh víi \w vµ chç b¾t ®Çu hay kÕt thóc cña x©u. Chó ý r»ng ®iÒu nµy Ýt ph¶i xö lÝ ®èi víi tiÕng Anh vµ ph¶i lµm nhiÒu ®èi víi c¸c kÝ hiÖu C, nhng ®iÒu ®ã còng gÇn th«i khi ta ®¹t tíi. Ch¼ng h¹n:

/fred\b/; # s¸nh fred, nhng kh«ng Frederick/\bwiz/; # s¸nh wiz vµ wizard, nhng kh«ng qwiz/\bFred\b/; # s¸nh Fred nhng kh«ng Frederick hay alFred/abc\bdef/; # kh«ng bao giê s¸nh (kh«ng thÓ cã cËn ë

®©y)Gièng thÕ, \B yªu cÇu kh«ng cã biªn giíi tõ t¹i vÞ trÝ ®· chØ

ra. Ch¼ng h¹n:

Page 96: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

/\bFred\B/; # s¸nh “Frederick” nhng kh«ng “Fred Flintstonee”

Hai neo n÷a yªu cÇu r»ng mét phÇn ®Æc biÖt cña khu«n mÉu ph¶i ®i ngay sau cuèi x©u. DÊu mò (^) s¸nh víi ®iÓm b¾t ®Çu cña x©u nÕu nã ®ang ë mét vÞ trÝ t¹o ra nghÜa ®Ó ®èi s¸nh t¹i chç b¾t ®Çu cña x©u. Ch¼ng h¹n, ^a s¸nh mét a nÕu vµ chØ nÕu a lµ kÝ tù ®Çu tiªn cña x©u. Tuy nhiªn, ^a còng s¸nh víi hai kÝ tù a vµ ^ ë bÊt k× ®©u trong x©u. Nãi c¸ch kh¸c, dÊu mò ®· mÊt ý nghÜa ®Æc biÖt cña nã. NÕu b¹n cÇn dÊu mò lµ mét h»ng kÝ hiÖu dÊu mò ngay t¹i chç b¾t ®Çu, th× h·y ®Æt mét dÊu sæ chÐo ngîc phÝa tríc nã.

DÊu $ còng gièng nh ^, neo l¹i khu«n mÉu, nhng t¹i cuèi cña x©u, kh«ng ph¶i b¾t ®Çu. nãi c¸ch kh¸c, c$ s¸nh víi mét c chØ nÕu nã xuÊt hiÖn t¹i cuèi x©u. DÊu ®« la ë bÊt k× n¬i ®©u kh¸c trong khu«n mÉu cã lÏ vÉn cø ®îc diÔn gi¶i nh c¸ch hiÓu gi¸ trÞ v« híng, cho nªn b¹n gÇn nh bao giê còng ph¶i dïng dÊu sæ chÐo ngîc ®Ó ®èi s¸nh mét dÊu hiÖu ®« lµ hµng kÝ hiÖu trong x©u.

Thø tù u tiªnVËy ®iÒu g× x¶y ra khi ta lÊy a|b* cïng nhau? LiÖu ®©y lµ

a hay b mét sè lÇn bÊt k× hay chØ mét a hay nhiÒu b?§îc råi, còng gièng nh c¸c to¸n tö cã sè u tiªn, c¸c khu«n mÉu

bá neo vµ gép nhãm còng cã sè u tiªn. Sè u tiªn cña khu«n mÉu tõ cao xuèng thÊp nhÊt ®îc cho trong B¶ng 7-2.

B¶ng 7-2: Sè u tiªn to¸n tö gép nhãm biÓu thøc chÝnh qui (cao nhÊt xuèng thÊp nhÊt)

Tªn BiÓu diÔnDÊu ngoÆc trßn ( )Sè béi + * ? {m,n}TuÇn tù vµ bá neo

abc^$\b\B

Thay phiªn |Theo b¶ng nµy, * cã sè u tiªn cao h¬n |. Cho nªn /a|b*/ ®îc

diÕn gi¶i nh mét a, hay sè bÊt k× b.§iÒu g× x¶y ra nÕu ta muèn mét nghÜa kh¸c, nh trong “bÊt

k× sè a hay b nµo”? Chóng ta ®¬n thuÇn chØ nÐm vµo mét cÆp dÊu ngoÆc. Trong trêng hîp nµy, b¹n h·y bao phÇn cña

Page 97: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

biÓu thøc mµ to¸n tö * cÇn ¸p dông, vµo bªn trong c¸c dÊu ngoÆc, vµ ta sÏ ®îc nã, nh (a|b)*. NÕu b¹n muèn lµm râ rµng biÓu thøc thø nhÊt, th× b¹n cã thÓ ®ãng dÊu ngoÆc d thõa nã víi a|(b*).

Khi b¹n dïng dÊu ngoÆc ®Ó t¸c ®éng tíi sè u tiªn th× chóng còng ®Æt lÉy bé nhí, nh ®· chØ ra tríc ®©y trong ch¬ng nµy. Tøc lµ tËp c¸c dÊu ngoÆc nµy sÏ cÇn ®îc ®Õm khi b¹n muèn nãi tíi mét c¸i g× ®ã lµ \2, \3 hay bÊt k× c¸i g×. Mét ngµy nµo ®ã cã thÓ cã mét lo¹i dÊu ngoÆc mµ kh«ng ph¶i ®Õm, nhng cha cã trong lÇn ®a ra Perl 4.036.

Sau ®©y lµ mét sè thÝ dô kh¸c vÒ biÓu thøc chÝnh qui, vµ t¸c ®éng cña dÊu ngoÆc:

abc* $ s¸nh víi ab, abc, abcc, abccc, abcccc v©n v©n(abc)* # s¸nh víi “”, abc, abcabc, abcabcabc v©n v©n^x|y # s¸nh x t¹i ®Çu dßng, hay y ë bÊt k× ®©u^(x|y) # s¸nh hoÆc víi x hoÆc víi y t¹i ®Çu dßnga|bc|d # a hoÆc bc hoÆc d(a|b)(c|d) # ac, ad, bc hoÆc bd(song|blue)bird # songbird hay bluebird

Thªm vÒ to¸n tö ®èi s¸nhTa ®· nh×n vµo c¸ch dïng ®¬n gi¶n nhÊt cña to¸n tö ®èi

s¸nh (mét biÓu thøc chÝnh qui ®îc bao trong sæ chÐo). B©y giê ta h·y nh×n vµo v« vµn c¸ch lµm cho to¸n tö nµy lµm ®îc ®iÒu g× ®ã h¬i kh¸c h¬n.

Chän mét môc tiªu kh¸c (to¸n tö =~)§«i khi x©u b¹n muèn s¸nh víi khu«n mÉu l¹i kh«ng bªn trong

biÕn $_, vµ ®ã sÏ lµ s¾c th¸i ®Ó ®Æt nã ë ®ã (cã lÏ b¹n ®· cã mét gi¸ trÞ trong $_ mµ b¹n rÊt thÝch). Kh«ng hÒ g×. To¸n tö =~ sÏ gióp chóng ta ë ®©y. To¸n tö nµy nhËn mét to¸n tö biÓu thøc chÝnh qui ë vÕ bªn ph¶i, råi thay ®æi ®èi tîng cña to¸n tö nµy thµnh mét c¸i g× ®ã bªn c¹nh biÕn $_ - cã nghÜa lµ mét gi¸ trÞ nµo ®ã cã tªn bªn vÕ tr¸i cña to¸n tö nµy. Nã tr«ng tùa nh thÕ nµy:

$a = “hello world”;$a =~ /^he/; # ®óng$a =~ /(.)\l/; # còng ®óng (s¸nh víi hai l)if ($a =~ /(.)\1/) { # ®óng, cho nªn cã ...

# mét sè chÊt liÖu kh¸c}

Page 98: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Môc tiªu cña to¸n tö =~ cã thÓ lµ bÊt k× biÓu thøc nµo cho mét gi¸ trÞ x©u v« híng nµo ®ã. Ch¼ng h¹n, <STDIN> cho mét gi¸ trÞ x©u v« híng khi ®îc dïng trong hoµn c¶nh v« híng, cho nªn chóng ta cã thÓ tæ hîp ®iÒu nµy víi to¸n tö =~ vµ mét to¸n tö s¸nh biÓu thøc chÝnh qui ®Ó ®îc mét kiÓm tra gän gµng vÒ c¸i vµo ®Æc biÖt, nh trong:

print “cßn yªu cÇu nµo n÷a kh«ng?”;if (<STDIN> =~ /^[yY]/) { # c¸i vµo cã b¾t ®Çu b»ng mét

y kh«ng?print “VËy yªu cÇu ®ã cã thÓ lµ g×? ”;

<STDIN>; # bá mét dßng c¸i vµo chuÈnprint “RÊt tiÕc, t«i kh«ng thÓ lµm ®îc ®iÒu ®ã.\n”;Trong trêng hîp nµy, to¸n tö <STDIN> cho dßng tiÕp tõ c¸i

vµo chuÈn, mµ råi ngay lËp tøc ®îc dïng nh x©u ®em s¸nh víi khu«n mÉu ^[yY]. Lu ý r»ng b¹n cha bao giê cÊt gi÷ c¸i vµo vµo mét biÕn, cho nªn nÕu b¹n muèn s¸nh c¸i vµo víi mÉu kh¸c, hay cã thÓ cho hiÖn l¹i d÷ liÖu trong mét th«ng b¸o lçi th× b¹n khong gÆp may råi. Nhng d¹ng nµy thêng hay ®Õn ®óng lóc.Bá qua ch÷ hoa thêng

Trong thÝ dô tríc, t«i ®· dïng [yY] ®Ó ®èi s¸nh hoÆc ch÷ Y hoa hoÆc y thêng. Víi nh÷ng x©u rÊt ng¾n nh y hay fred th× ®iÒu nµy lµ dÔ dµng, nh [fF] [oO][oO]. Nhng ®iÒu g× xÈy ra nÕu x©u t«i muèn s¸nh l¹i lµ tõ “procedure” trong hoÆc ch÷ thêng hoÆc ch÷ hoa?

Trong mét sè b¶n cña grep, cê -i chØ ra “bá qua hoa thêng”. Perl còng cã tuú chän nh vËy. B¹n chØ ra tuú chän bá qua hoa thêng b»ng c¸ch thªm vµo ch÷ i thêng vµo sau sæ chÐo ®ãng, nh trong /somepattern/i. §iÒu nµy nãi lªn r»ng c¸c ch÷ cña khu«n mÉu nµy sÏ s¸nh víi c¸c ch÷ trong x©u trong c¶ ch÷ hoa lÉn thêng. Ch¼ng h¹n, ®Ó s¸nh tõ “procedure” trong c¶ hoa lÉn thêng t¹i ®Çu dßng, b¹n h·y dïng /^procedure/i.

B©y giê thÝ dô tríc cña ta trong gièng thÕ nµy:print “cßn yªu cÇu nµo n÷a kh«ng?”;if (<STDIN> =~ /^y/i) { # c¸i vµo cã b¾t ®Çu b»ng mét y

kh«ng?# cã! xö lÝ cho nã...

}Dïng mét ®Þnh biªn kh¸c

NÕu b¹n ®ang t×m kiÕm mét x©u víi mét biÓu thøc chÝnh

Page 99: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

qui cã chøa kÝ tù sæ chÐo (/), th× b¹n ph¶i ®Æt tríc mçi sæ chÐo mét sæ chÐo ngîc (\). Ch¼ng h¹n, b¹n cã thÓ t×m mét x©u b¾t ®Çu b»ng /usr/etc tùa nh thÕ nµy:

$path = <STDIN>; # ®äc mét tªn ®êng dÉn (cã lÏ tõ “find”?)

if ($path =~ /^\/usr\/etc/) {# b¾t ®Çu víi /usr/etc ...

}Nh b¹n cã thÓ thÊy, tæ hîp sæ chÐo ngîc-sæ chÐo lµm cho

nã tr«ng gièng nh cã mét thung lòng nhá gi÷a hai mÈu v¨n b¶n. Lµm ®iÒu nµy cho nhiÒu sæ chÐo cã thÓ g©y cång kÒnh, cho nªn Perl cho phÐp b¹n x¸c ®Þnh mét kÝ tù ®Þnh biªn kh¸c. ChØ cÇn ®Æt tríc bÊt k× kÝ tù phi ch÷-sè* nµo (®Þnh biªn do b¹n chän) víi mét m, råi liÖt kª khu«n mÉu cña b¹n theo sau bëi mét kÝ tù ®Þnh biªn y hÖt thÕ n÷a, lµ b¹n ®· hoµn thµnh, nh trong:

/^\/usr/etc/ # dïng ®Þnh biªn sæ chÐo chuÈnm@^/usr/etc@ # dïng @ lµm ®Þnh biªnm#^/usr/etc# # dïng # lµm ®Þnh biªn (së thÝch cña t«i)B¹n cã thÓ thËm chÝ dïng c¶ sæ chÐo lÇn n÷a nÕu b¹n cø

muèn, nh trong m/fred/, cho nªn to¸n tö s¸nh biÓu thøc chÝnh qui th«ng thêng thùc sù lµ to¸n tö m, tuy nhiªn, m lµ tuú chän, nÕu b¹n chän sæ chÐo lµm ®Þnh biªn.Dïng xen lÉn biÕn

Mét biÓu thøc chÝnh qui lµ ®îc xen lÉn biÕn tríc khi nã ®îc xem xÐt cho c¸c kÝ tù ®Æc biÖt kh¸c. Do ®ã, b¹n cã thÓ x©y dùng mét biÓu thøc chÝnh qui tõ c¸c x©u ®wojc tÝnh to¸n thay v× chØ lµ h»ng ksi hiÖu. Ch¼ng h¹n:

$what = “bird”;$sentence = “Mäi con chim tèt ®Òu bay.”;if ($sentence =~ /\b$what\b/) {

print “C©u nµy chøa tõ $what!\n”;}T¹i ®©y chóng ta ®· x©y dùng mét c¸ch cã hiÖu qu¶ to¸n tö

biÓu thøc chÝnh qui /\bbird\b/ b»ng viÖc dïng mét tham kh¶o biÕn.

Sau ®©y lµ mét thÝ dô cã h¬i phøc t¹p h¬n:$sentence = “Mäi con chim tèt ®Òu bay.”;

* NÕu dÊu ®Þnh biªn ngÉu nhiªn lµ kÝ tù bªn tr¸i hay cÆp tr¸i-ph¶i (ngoÆc trßn, ngoÆc nhän hay ngoÆc vu«ng), th× dÊu ®Þnh biªn ®ãng lµ kÝ tù bªn ph¶i cña cïng cÆp ®ã. Nhng ngoµi ra, c¸c kÝ tù lµ hÖt nhau cho b¾t ®Çu vµ kÕt thóc.

Page 100: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

print “T«i ph¶i t×m c¸i g× ®©y?”;$what = <STDIN>;chop ($what) ;if ($sentence =~ /$what/) { # t×m thÊy nã!

print “T«i ®· thÊy $what trong $sentence.\n”;} else {

print “kh«ng... ch¼ng thÊy cãc g× c¶.\n”;}NÕu b¹n ®a vµo bird, th× nã ®îc t×m ra. NÕu b¹n ®a vµo

scream nã sÏ kh«ng t×m thÊy. NÕu b¹n ®a vµo [bw]ird, ®iÒu Êy còng ®îc t×m ra, chØ ra r»ng c¸c kÝ tù ®èi s¸nh khu«n mÉu biÓu thøc chÝnh qui qu¶ thùc lµ vÉn cã ý nghÜa. T«i sÏ chØ ra cho b¹n trong phÇn “Thay thÕ” díi ®©y vÒ c¸ch thay ®æi x©u ®Ó cho c¸c ksi tù ®èi s¸nh khu«n mÉu chÝnh qui ®îc t¾t ®i.BiÕn chØ ®äc ®Æc biÖt

Sau khi ®èi s¸nh khu«n mÉu thµnh c«ng, c¸c biÕn $1, $2, $3 v©n v©n sÏ ®îc ®Æt cho cïng gi¸ trÞ lµ \1, \2, \3 v©n v©n. B¹n cã thÓ dïng ®iÒu nµy ®Ó nh×n vµo mét phÇn cña viÖc ®èi s¸nh trong ®o¹n ch¬ng tr×nh sau. Ch¼ng h¹n:

$_ = “®©y lµ phÐp kiÓm tra”;/(\W+)\W+(\W+)/; # ®èi s¸nh hai tõ ®Çu# $1 b©y giê lµ “®©y” cßn $2 b©y giê lµ “lµ”B¹n còng cã thÓ thu ®îc cïng c¸c gi¸ trÞ ($1, $2, $3 v©n

v©n) b»ng viÖc ®Æt ®èi s¸nh trong hoµn c¶nh m¶ng. KÕt qu¶ lµ mét danh s¸ch c¸c gi¸ trÞ mµ sÏ ®îc ®Æt cho $1 cho tíi sè c¸c vËt ®îc ghi nhí, nhng chØ nÕu biÓu thøc chÝnh qui s¸nh ®óng. Ta h·y lÊy l¹i thÝ dô tríc theo c¸ch kh¸c

$_ = “®©y lµ phÐp kiÓm tra”;($first, $second) = /(\W+)\W+(\W+)/; # ®èi s¸nh hai tõ ®Çu# $first b©y giê lµ “®©y” cßn $second b©y giê lµ “lµ”Lu ý r»ng c¸c biÕn $1 vµ $2 vÉn kh«ng bÞ thay ®æi.C¸c biÕn chØ ®äc ®îc x¸c ®Þnh tríc cßn bao gåm $&, mµ lµ

mét phÇn cña x©u s¸nh ®óng víi biÓu thøc chÝnh qui; $`, lµ mét phÇn cña x©u tríc phÇn s¸nh ®óng; cßn $’ lµ phÇn cña x©u sau phÇn s¸nh ®óng. Ch¼ng h¹n:

$_ = “®©y lµ x©u mÉu”;/x©.*u/; # s¸nh “x©u” bªn trong x©u# $` b©y giê lµ “®©y lµ”# $& b©y giê lµ “x©u”# $’ b©y giê lµ “mÉu”

Page 101: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

V× tÊt c¶ nh÷ng biÕn nµy ®Òu ®îc ®Æt l¹i cho tõng lÇn s¸nh thµnh c«ng cho nªn b¹n nªn cÊt gi÷ c¸c gi¸ trÞ trong c¸c biÕn v« híng kh¸c nÕu b¹n cÇn c¸c gi¸ trÞ ®ã vÒ sau trong ch-¬ng tr×nh.

Thay thÕChóng ta ®· nãi vÒ d¹ng ®¬n gi¶n nhÊt cña to¸n tö thay

thÕ: s/old-regex/new-string/. B©y giê lµ lóc nãi tíi vµi biÕn thÓ cña to¸n tö nµy.

NÕu b¹n muèn viÖc thay thÕ vËn hµnh trªn tÊt c¶ c¸c ®èi s¸nh cã thÓ thay v× chØ viÖc ®èi s¸nh ®Çu tiªn th× h·y viÕt thªm g vµo to¸n tö nµy, nh trong:

$_ = “foot fool buffon”;s/foo/bar/g; # $_ b©y giê lµ “bart barl bufbarn”X©u thay thÕ cã biÕn xen vµo, cho phÐp b¹n x¸c ®Þnh x©u

thay thÕ vµo lóc ch¹y:$_ = “hello, world” ;$new = “goodbye”;s/hello/$new/; # thay thÕ hello b»ng goodbyeC¸c kÝ tù khu«n mÉu trong biÓu thøc chÝnh qui cho phÐp

c¸c khu«n mÉu ®îc ®èi s¸nh, thay v× chØ lµ c¸c kÝ tù cè ®Þnh:

$_ = “®©y lµ phÐp kiÓm tra”;s/(\w+)/<$1>/g; # $_ b©y giê lµ “<®©y> <lµ> <phÐp>

<kiÓm> <tra>”Nhí l¹i r»ng $1 ®îc ®Æt lµ d÷ liÖu bªn trong viÖc ®èi s¸nh

®óng mÉu trong dÊu ngoÆc.HËu tè i (hoÆc tríc hoÆc sau g nÕu cã) lµm cho biÓu thøc

chÝnh qui trong to¸n tö thay thÕ bá qua ch÷ hoa thêng, gièng nh cïng tuú chän trªn to¸n tö ®èi s¸nh ®· m« t¶ tríc ®©y.

Còng vËy, gièng nh to¸n tö ®èi s¸nh, mét dÊu ®Þnh biªn kh¸c còng cã thÓ ®îc tuyÓn lùa nÕu sæ chÐo lµ kh«ng tiÖn. ChØ cÇn dïng cïng kÝ tù ®ã ba lÇn:*

s#fred#barney#; # thay fred b»ng barney, gièng s/fred/barney/

Còng vËy, gièng to¸n tö ®èi s¸nh, b¹n cã thÓ x¸c ®Þnh mét * hoÆc hai cÆp s¸nh nhau nÕu kÝ tù tr¸i - ph¶i ®îc dïng.

Page 102: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

môc tiªu thay phiªn b»ng to¸n tö =~. Trong trêng hîp nµy, môctiªu ®îc chän ph¶i lµ mét c¸i g× ®ã mµ b¹n cã thÓ g¸n cho mét gi¸ trÞ v« híng vµo, nh mét biÕn v« híng hay mét phÇn tö cña m¶ng. Sau ®©y lµ mét thÝ dô:

$which = “®©y lµ phÐp thö”;$which =~ s/thö/®è/; # $which b©y giê lµ “®©y lµ phÐp

®è”$someplace[$here] =~ s/left/right/; # ®æi mét phÇn tö

m¶ng$d{”t”} =~ s/^/x/; # thay bÊt k× kÝ tù nµo b»ng “x “ cho

phÇn tö m¶ng kÕt hîpC¸c to¸n tö split() vµ join()

BiÓu thøc chÝnh qui cã thÓ ®îc dïng ®Ó chÆt mét x©u thµnh c¸c trêng. To¸n tö split() thùc hiÖn ®iÒu nµy cßn to¸n tö join() l¹i cã thÓ dÝnh c¸c mÈu l¹i víi nhau.To¸n tö split()

To¸n tö split() nhËn mét biÓu thøc chÝnh qui vµ mét x©u råi t×m tÊt c¶ mäi sù xuÊt hiÖn cña biÓu thøcchÝnh qui bªn trong x©u nµy (dêng nh b¹n ®· thùc hiÖn to¸n tö s///g). C¸c bé phËn cña x©u kh«ng s¸nh víi biÓu thøc chsinh qui sÏ ®îccho l¹i lÇn lît nh mét danh s¸ch c¸c gi¸ trÞ. Ch¼ng h¹n, sau ®©y lµ mét c¸ch ph©n tÝch c¸c thµnh tè /etc/passwd:

$line = “merlyn::118:10:Randal:/home/merlyn:/usr/bin/perl”;@fields = split(/:/,$line); # chÆt $line ra, dïng : lµm dÊu

®Þnh biªn# b©y giê @field lµ (“merlyn”, “”, “118”, “10”, “Randal”,# “/home/merlyn”,”/usr/bin/perl”)Lu ý r»ng trêng thø hai rçng trë thµnh mét x©u rçng. NÕu

b¹n kh«ng muèn ®iÒu nµy, h·y ®èi s¸nh tÊt c¶ c¸c hai chÊm trong mét lÇn ph©n t¸ch:

@fields = split(/:+/, $line);§iÒu nµy sÏ s¸nh c¶ hai dÊu hai chÊm ®i kÌm, cho nªn sÏ

kh«ng cã trêng thø hai rçng n÷a.Mét x©u th«ng dông ®Ó chÆt biÕn $_, vµ biÕn thµnh mÆc

®Þnh lµ:$_ = “x©u nµo ®ã”;@words = split(/ /); # hÖt nh @words = split(/ /, $_);Lu ý r»ng ®èi víi viÖc chÆt nµy, c¸c kho¶ng c¸ch liªn tiÕp

Page 103: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

trong x©u cÇn chÆt sÏ g©y ra c¸c trêng kh«ng (x©u rçng) trong kÕt qu¶. Mét khu«n mÉu tèt h¬n sÏ lµ / +/, hay mét c¸ch lÝ tëng /\s+/, mµ sÏ ®èi s¸nh mét hay nhiÒu kÝ tù kho¶ng tr¾ng. Trong thùc tÕ, khu«n mÉu nµy lµ khu«n mÉu mÆc ®Þnh, cho nªn nÕu b¹n ®Þnh chÆt biÕn $_ theo c¸c kho¶ng tr¾ng, th× b¹n cã thÓ dïng tÊt c¶ c¸c mÆc ®Þnh vµ ®¬n thuÇn nãi:

@words = split; # hÖt nh @words = split(/\s+/, $_);C¸c trêng theo sau rçng kh«ng trë thµnh mét phÇn cña danh

s¸ch. §iÒu nµy nãi chung kh«ng cÇn quan t©m - mét gi¶i ph¸p gièng thÕ nµy:

$line = “merlyn::118:10:Randal:/home/merlyn:/usr/bin/perl”;($name, $password, $uid,$gid,$gcos,$home,$shell) =split(/:/, $line); # chÆt $line ra b»ng c¸ch dïng : lµm dÊu

®Þnh biªnsÏ ®¬n thuÇn cho $shell mét gi¸ trÞ kh«ng (undef) nÕu dßng

nµy kh«ng ®ñ dµi, hay nÕu nã chøa c¸c gi¸ trÞ rçng trong trêng cuèi. (C¸c trêng phô th× im lÆng bÞ bá qua, v× viÖc g¸n danh s¸ch lµm viÖc theo c¸ch ®ã.)To¸n tö join()

To¸n tö join() nhËn mét danh s¸ch c¸c gi¸ trÞ vµ g¾n chóng l¹i víi nhau dïng x©u g¾n gi÷a tõng phÇn tö danh s¸ch. Nã tr«ng tùa nh thÕ nµy:

$bigstring = join($glue, @list);Ch¼ng h¹n, ®Ó x©y dùng l¹i dßng mËt hiÖu, b¹n h·y thö mét

c¸ch kiÓu nh:$outline = join(“:”, @fields);Lu ý r»ng x©u g¾n kh«ng ph¶i lµ biÓu thøc chÝnh qui - chØ

lµ mét x©u b×nh thêng gåm kh«ng hay nhiÒu kÝ tù.Bµi tËp

Xem Phô lôc A vÒ lêi gi¶i.1. H·y x©y dùng mét biÓu thøc chÝnh qui mµ s¸nh cho:

(a) Ýt nhÊt mét a theo sau bëi mét sè bÊt k× b(b) mét sè bÊt k× dÊu sæ chÐo ngîc theo sau bëi mét sè

bÊt k× dÊu sao(c) ba b¶n sao liªn tiÕp cña bÊt k× c¸i g× cã chøa trong

$whatever

Page 104: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

(d) bÊt k× n¨m kÝ tù nµo, kÓ c¶ dÊu dßng míi(e) cïng mét tõ ®îc viÕt hai hay nhiÒu lÇn trong mét

hµng, víi ‘tõ” ®îc x¸c ®Þnh nh d·y c¸c kÝ tù kh¸c kho¶ng tr¾ng kh«ng rçng.

2. (a) H·y viÕt mét ch¬ng tr×nh nhËn mét danh s¸ch c¸c tõ trªn STDIN vµ t×m mét dßng cã chøa tÊt c¶ n¨m nguyªn ©m (a, e, i, o , u). H·y ch¹y ch¬ng tr×nh nµy trªn /usr/dict/words vµ xem nã cho ra c¸i g×. Nãi c¸ch kh¸c, h·y ®a vµo:

$ myprogram < /usr/dict/words(§iÒu nµy gi¶ sö b¹n ®Æt tªn ch¬ng tr×nh cña m×nh lµ

myprogram)(b) H·y söa ®æi ch¬ng tr×nh nµy ®Ó cho n¨m nguyªn ©m nµy

®îc s¾p thø tù3. H·y viÕt mét ch¬ng tr×nh t×m trong /etc/passwd (trªn

STDIN), in ra tªn ®¨ng nhËp vµ tªn thËt cña tõng ngêi dïng. (Híng dÉn: dïng split ®Ó chÆt dßng nµy thµnh c¸c trêng, råi s/// ®Ó bá c¸c phÇn trêng comment ®i sau dÊu phÈy thø nhÊt.)

4. H·y viÕt mét ch¬ng tr×nh t×m trong /etc/passwd (trªn STDIN) hai ngêi dïng cã cïng hä, råi in ra tªn cña hä. (Híng dÉn: sau khi trÝch ra tªn, h·y t¹o ra mét m¶ng kÕt hîp víi tªn ®ã lµm kho¸ vµ sè lÇn gÆp nã lµ gi¸ trÞ. Khi dßng cuèi cña STDIN ®· ®îc ®äc vµo th× h·y duyÖt qua m¶ng kÕt hîp ®Ó ®Õm c¸c sè lín h¬n 1.)

5. H·y lÆp l¹i bµi tËp tríc, nhng b¸o c¸o vÒ tªn ®¨ng nhËp cña tÊt c¶ ngêi dïng víi cïng tªn cña hä. (Híng dÉn: thay v× cÊt gi÷ mét sè ®Õm, h·y cÊt gi÷ mét danh s¸ch c¸c tªn ®¨ng nhËp c¸ch nhau b»ng dÊu c¸ch. Khi kÕt thóc, h·y duyÖt qua c¸c gi¸ trÞ mµ cã chøa mét dÊu c¸ch.)

Page 105: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

8

Hµm

Hµm hÖ thèng vµ hµm ngêi dïngChóng ta ®Òu ®· thÊy vµ ®· dïng c¸c hµm hÖ thèng, nh

chop, print v©n v©n. B©y giê ta h·y nh×n vµo c¸c hµm mµ b¹n ®Þnh nghÜa ra, t¹o nªn c¸c lÖnh ch¬ng tr×nh Perl.X¸c ®Þnh mét hµm ngêi dïng

Mét hµm ngêi dïng, thêng hay ®îc gäi lµ ch¬ng tr×nh con hay tr×nh con, ®îc x¸c ®Þnh trong ch¬ng tr×nh Perl cña b¹n b»ng viÖc dïng mét kÕt cÊu nh:

sub subname {c©u lÖnh 1;c©u lÖnh 2;c©u lÖnh 3;

}subname lµ tªn cña ch¬ng tr×nh con, lµ bÊt k× tªn nµo

gièng nh tªn ta ®· ®Æt cho biÕn v« híng, m¶ng vµ m¶ng kÕt hîp. Mét lÇn n÷a, nh÷ng tªn nµy l¹i ®Õn tõ mét kh«ng gian tªn kh¸c, cho nªn b¹n cã thÓ cã mét biÕn v« híng $fred, mét m¶ng @fred, mét m¶ng kÕt hîp %fred, vµ b©y giê mét tr×nh con fred.

Khèi c¸c c©u lÖnh ®i sau tªn tr×nh con trë thµnh ®Þnh nghÜa cña tr×n hcon. Khi tr×nh con ®îc gäi tíi (®îc m« t¶ ng¾n gän), th× khèi c¸c c©u lÖnh t¹o nªn tr×nh con nµy sÏ ®îc thùc hiÖn, vµ bÊt k× gi¸ trÞ cho l¹i nµo (®îc m« t¶ sau ®©y) ®Òu ®îc tr¶ vÒ cho n¬i gäi.

Ch¼ng h¹n sau ®©y lµ mét tr×nh con cho hiÓn thÞ c©u nãi næi tiÕng:

sub say_hello { print “Xin chµo, mäi ngêi!\n”;

Trong ch¬ng nµy: C¸c hµm hÖ

thèng vµ ngêi dïng

§Þnh nghÜa mét hµm ngêi dïng

Cho l¹i gi¸ trÞ

Page 106: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}§Þnh nghÜa tr×nh con cã thÓ ë bÊt k× ®©u trong v¨n b¶n

ch¬ng tr×nh cña b¹n (chóng bÞ bá qua khi thùc hiÖn), nhng t«i th× thÝch ®Æt tÊt c¶ c¸c tr×nh con cña t«i vµo cuèi tÖp, ®Ó cho phÇn cßn l¹i cña ch¬ng tr×nh cã vÎ nh lµ ë ®Çu tÖp. (NÕu b¹n thÝch nghÜ theo kiÓu Pascal th× b¹n cã thÓ ®Æt c¸c tr×nh con cña m×nh vµo ®Çu vµ c¸c c©u lÖnh thùc hiÖn vµo cuèi. §iÒu ®Êy th× tuú b¹n.)

C¸c ®Þnh nghÜa tr×nh con lµ toµn côc; kh«ng cã tr×nh con côc bé. NÕu b¹n cã hai ®Þnh nghÜa tr×nh con víi cïng tªn th× tr×nh sau sÏ ®Ì lÊp tr×nh tríc mµ kh«ng cã c¶nh b¸o g× c¶.

Bªn trong th©n tr×nh con, b¹n cã thÓ th©m nhËp hay ®Æt c¸c gi¸ trÞ cho c¸c biÕn ®îc dïng chung víi phÇn cßn l¹i cña ch-¬ng tr×nh (biÕn toµn côc). Trong thùc tÕ, theo mÆc ®Þnh, mäi tham kh¶o biÕn bªn trong th©n tr×nh con ®Òu tham kh¶o tíi biÕn toµn côc. T«i m¸ch b¹n vÒ c¸c biÖt lÖ trong môc “BiÕn côc bé trong hµm” ë díi ®©y. Trong thÝ dô sau:

sub say_what { print “Xin chµo, $what\n”;}$what tham kh¶o tíi gi¸ trÞ toµn côc cho $what mµ ®îc dïng

chung víi phÇn cßn l¹i cña ch¬ng tr×nh.Gäi mét hµm ngêi dïng

B¹n gäi mét tr×nh con tõ bªn trong bÊt k× biÓu thøc nµo b»ng viÖc ®Æt tríc tªn tr×nh con nµy mét dÊu vµ &, nh trong:

&say_hello; # mét biÓu thøc ®¬n gi¶n$a = 3 + &say_hello; # phÇn cña biÓu thøc lín h¬nfor ($x = &start_value; $x < &end_value; $x += &increment)

{...

} # gäi ba tr×nh con ®Ó x¸c ®Þnh c¸c gi¸ trÞMét tr×nh con cã thÓ gäi mét tr×nh con kh¸c, vµ tr×nh con

kh¸c nµy ®Õn lît nã l¹i cã thÓ gäi tr×nh con kh¸c n÷a, vµ cø nh thÕ, cho tíi khi tÊt c¶ bé nhí cã s½n ®· bÞ chÊt ®Çy b»ng ®Þa chØ quay vÒ vµ c¸c biÓu thøc ®îc tÝnh to¸n bé phËn. (Kh«ng cã t¸m hay 32 møc nµo cã thÓ tho¶ m·n ®îc cho ngêi mª Perl.)Gi¸ trÞ cho l¹i

Gièng nh trong C, mét tr×nh con bao giê còng lµ mét phÇn

Page 107: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

cña mét biÓu thøc nµo ®ã (kh«ng cã c¸i t¬ng ®¬ng trong lêi gäi thñ tôc tùa Pascal). Gi¸ trÞ cña viÖc gäi tr×nh con ®îc gäi lµ gi¸ trÞ cho l¹i. Gi¸ trÞ cho l¹i cña mét tr×nh con lµ gi¸ trÞ cña biÓu thøc cuèi cïng ®îc tÝnh bªn trong th©n cña tr×nh con cho mçi lÇn gäi.

Ch¼ng h¹n, ta h·y ®Þnh nghÜa tr×nh con nµy:sub sum_of_a_and_b {

$a + $b;}BiÓu thøc cuèi cïng ®îc tÝnh trong th©n cña tr×nh con nµy

(trong thùc tÕ, ®ã lµ biÓu thøc duy nhÊt ®îc tÝnh) lµ tæng cña $a vµ $b, cho nªn tæng cña $a vµ $b sÏ lµ gi¸ trÞ cho l¹i. Sau ®©y lµ ffiÒu ®ã trong hµnh ®éng:

$a = 3; $b = 4;$c = &sum_of_a_and_b; #c nhËn 7$d = 3*sum_of_a_and_b; # $d nhËn 21Mét tr×nh con còng cã thÓ cho l¹i mét danh s¸ch c¸c gi¸ trÞ

khi ®îc tÝnh trong hoµn c¶nh m¶ng. ta h·y xÐt tr×nh con nµy vµ lêi gäi:

sub list_of_a_and_b {($a, $b);

}$a = 5; $b = 6;$c = &list_of_a_and_b; # @c nhËn (5, 6)BiÓu thøc cuèi ®îc tÝnh thùc sù nghÜa lµ biÓu thøc cuèi cïng

®îc tÝnh, thay v× lµ biÓu thøc cuèi cïng ®îc x¸c ®Þnh trong th©n cña tr×nh con. Ch¼ng h¹n, tr×nh con nµy cho l¹i $a nÕu $a > 0, ngoµi ra nã cho $b:

sub gime_a_or_b {if ($a > 0) {

print “chän a ($a)\n”;$a;

} else {print “chän b ($b)\n”;$b;

}}Lu ý r»ng tr×nh con nµy còng cho hiÓn thÞ mét th«ng b¸o.

BiÓu thøc cuèi cïng ®îc tÝnh lµ $a hay $b, mµ trë thµnh gi¸ trÞ cho l¹i. NÕu b¹n ®¶o ngîc c¸c dßng cã chøa $a vµ print ngay tríc nã, th× b¹n sÏ nhËn ®îc mét gi¸ trÞ cho l¹i lµ 1 (gi¸ trÞ ®îc cho

Page 108: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

l¹i bëi hµm print thµnh c«ng) thay v× gi¸ trÞ cña $a.TÊt c¶ chóng ®Òu lµ c¸c thÝ dô kh¸ tÇm thêng. Tèt h¬n c¶

lµ ta nªn truyÒn c¸c gi¸ trÞ kh¸c nhau cho mçi lÇn gäi tíi mét tr×nh con thay v× ph¶i dùa vµo c¸c biÕn toµn côc. Trong thùc tÕ, ®iÒu ®ã còng ®óng ®Õn chç cÇn nãi.§èi

MÆc dÇu c¸c tr×nh con cã mét chøc n¨ng ®Æc biÖt lµ cã Ých, toµn bé møc ®é cã Ých míi trë thµnh s½n cã cho b¹n khi b¹n cã thÓ truyÒn c¸c ®èi cho tr×nh con. Trong Perl nÕu lêi gäi tr×nh con (víi dÊu vµ @ cïng tªn tr×nh con) cã theo sau nã mét danh s¸ch n»m trong ngoÆc trßn, th× danh s¸ch nµy dÏ ®îc tù ®éng g¸n cho mét biÕn ®Æc biÖt cã tªn @_ trong suèt thêi gian ho¹t ®éng cña tr×nh con. Tr×nh con cã thÓ th©m nhËp vµo biÕn nµy ®Ó x¸c ®Þnh sè c¸c ®èi vµ gi¸ trÞ cña c¸c ®èi ®ã. Ch¼ng h¹n:

sub say_hello_to {print “Hello, $_[0]!\n”; # tham biÕn ®Çu lµ môc tiªu

}T¹i ®©y ta thÊy mét tham kh¶o tíi $_[0], chÝnh lµ phÇn tö

®Çu tiªn cña m¶ng @_. Lu ý ®Æc biÖt: t¬ng tù nh d¸ng vÎ cña chóng, gi¸ trÞ $_[0] (phÇn tö ®Çu tiªn cña m¶ng @_) ch¼ng cã bÊt k× liªn quan g× víi biÕn $_ (mét biÕn v« híng cña riªng nã). B¹n ®õng lÇm lÉn chóng! Tõ ch¬ng tr×nh nµy, râ rµng nã nãi hello víi bÊt k× c¸i g× chóng ta truyÒn cho nã nh tham biÕn ®Çu tiªn. §iÒu ®ã cã nghÜa lµ chóng ta cã thÓ gäi nã gièng thÕ nµy:

&say_hello_to (“world”); # sÏcho hello, world!$x = “somebody”;&say_hello_to ($x); # cho hello, somebody!&say_hello_to (“me”) + &say_hello_to (“you”) # vµ me vµ

youLu ý r»ng trong dßng cuèi, gi¸ trÞ cho l¹i kh«ng thùc sù ®îc

dïng. Nhng trong khi tÝnh tæng Perl ph¶i tÝnh tÊt c¶ c¸c bé phËn cña nã, cho nªn tr×nh con nµy ®îc gäi hai lÇn.

Sau ®©y lµ mét thÝ dô vÒ viÖc dïng nhiÒu h¬n mét tham biÕn:

sub say {print “$_[0], $_[1]!\n”;

}

Page 109: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

&say (“hello”, “world”); # hello world, lÇn n÷a&say (“goodbye”, “cruel world”) # im lÆngC¸c tham biÕn vît qu¸ ®Òu bÞ bá qua - nÕu b¹n cha bao giê

nhßm ngã tíi $_[3], th× Perl còng ch¼ng bËn t©m. C¸c tham sè kh«ng ®ñ còng bÞ bá qua - b¹n ®¬n thuÇn nhËn ®îc undef nÕu b¹n nh×n vît ra cuèi cña m¶ng @_, nh víi mäi m¶ng kh¸c.

BiÕn @_ lµ côc bé cho tr×nh con nµy; nÕu cã mét biÕn toµn côc cho @_, nã sÏ ®îc cÊt gi÷ tríc khi tr×nh con ®îc gäi vµ ®îc kh«i phôc l¹i gi¸ trÞ tríc cña nã khi trë vÒ tõ ch¬ng tr×nh con. §iÒu nµy còng cã nghÜa lµ mét tr×nh con cã thÓ truyÒn c¸c ®èi cho mét tr×nh con kh¸c mµ kh«ng sî mÊt biÕn @_ riªng cña nã - viÖc gäi tr×nh con lång nhau ®Òu nhËn ®îc @_ riªng cña nã theo cïng c¸ch.

Ta h·y xem xÐt l¹i tr×nh “céng a vµ b” cña môc tríc. T¹i ®©y mét tr×nh con thùc hiÖn viÖc céng hai gi¸ trÞ bÊt k×, ®Æc biÖt, hai gi¸ trÞ ®îc truyÒn cho tr×nh con nµy nh tham biÕn.

sub add_two {$_[0] + $_[1];

}print &add_two (3, 4) ; # in 7$c = &add_two (5, 6) ; $c ®îc 11B©y giê ta h·y tæng qu¸t ho¸ ch¬ng tr×nh nµy. NÕu chóng

ta cã ba, bèn hay hµng tr¨m gi¸ trÞ cÇn ph¶i céng l¹i th× sao? Chóng ta cã thÓ lµm viÖc ®ã b»ng mét chu tr×nh, tùa nh:

sub add {$sum = 0 ; # khëi ®Çu gi¸ trÞ cho sumforeach $_ (@_ ) {

$sum += $_ ; # céng tõng phÇn tö}$sum ; # biÓu thøc cuèi ®îc tÝnh: tæng cña tÊt c¶ c¸c

phÇn tö}$a = &add(4,5,6) ; # céng 4+5+6 = 15, vµ g¸n cho $aprint &add(1,2,3,4,5) ; # ina ra 15print &add(1..5); # còng in ra 15, v× 1..5 ®îc më réng§iÒu g× x¶y ra nÕu ta cã motä biÕn mang tªn $sum khi ta

gäi &add_list? Chóng ta ®· ®¸nh tróng vµo nã. Trong môc tiÕp chóng ta sÏ xem c¸ch thøc tr¸nh ®iÒu nµy.

Page 110: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

BiÕn côc bé trong hµmChóng ta ®· nãi tíi biÕn @_ vµ c¸ch thøc viÖc sao chÐp côc

bé ®îc t¹o ra cho tõng tr×nh con cã gäi tíi tham biÕn. B¹n cã thÓ t¹o ra c¸c biÕn v« híng, m¶ng hay m¶ng kÕt hîp cña riªng m×nh lµm viÖc theo cïng c¸ch. B¹n lµm ®iÒu nµy víi to¸n tö local(), nhËn mét danh s¸ch c¸c tªn biÕn vµ t¹o ra c¸c b¶n côc bé cña chóng (hay c¸c thÓ nghiÖm, nÕu b¹n thÝch tõ ®ao to bóa lín). Sau ®©y l¹i lµ hµm céng ®ã, lÇn nµy dïng local():

sub add {local ($sum) ; # lµm cho $sum thµnh biÕn côc bé$sum = 0 ; # khëi ®Çu gi¸ trÞ cho sumforeach $_ (@_ ) {

$sum += $_ ; # céng tõng phÇn tö}$sum ; # biÓu thøc cuèi ®îc tÝnh: tæng cña tÊt c¶ c¸c

phÇn tö}Khi c©u lÖnh th©n ®Çu tiªn ®îc thùc hiÖn, th× bÊt k× gi¸

trÞ hiÖn t¹i nµo cña biÕn toµn côc $sum còng ®Òu ®îc cÊt gi÷ vµ mét biÕn míi mang tªn $sum sÏ ®îc t¹o ra (víi gi¸ trÞ undef). Khi tr×nh con nµy ®i ra, th× Perl bá qua biÕn côc bé vµ kh«i phôc gi¸ trÞ tríc (toµn côc). §iÒu nµy vËn hµnh c¶ khi biÕn $sum hiÖn lµ biÕn côc bé cña mét tr×nh con kh¸c (mét tr×nh con mµ gäi tíi tr×nh con nµy, hay mét tr×nh con gäi tíi mét tr×nh mµ gäi tíi tr×nh con nµy, v©n v©n). C¸c biÕn cã thÓ cã nhiÒu b¶n côc bé lång nhau, mÆc dÇu b¹n cã thÓ th©m nhËp mçi lóc chØ vµo mét biÕn.

Sau ®©y lµ c¸ch ®Ó t¹o ra mét danh s¸ch tÊt c¶ c¸c phÇn tö h¬n 100 cña mét m¶ng lín:

sub bigger_than_100 {local ($result) ; # t¹m thêi gi÷ gi¸ trÞ trë vÒforeach $_ (@_ ) { # ®i qua danh s¸ch ®èi

if ($_ > 100) { # cã ®ñ t c¸ch kh«ng?push (@result, $_) ; # céng nã

}$result ; # cho l¹i danh s¸ch cuèi

}§iÒu g× x¶y ra nÕu chóng ta muèn tÊt c¶ c¸c phÇn tö nµy lín

h¬n 50 thay v× 100? Chóng ta ph¶i söa ch¬ng tr×nh nµy, ®æi tÊt c¶ c¸c sè 100 thµnh 50. Nhng ®iÒu g× x¶y ra nÕu chóng ta l¹i cÇn c¶ hai? §îc, chóng ta cã thÓ thay thÕ 50 hay 100 b»ng mét biÕn tham kh¶o. §iÒu nµy lµm ch¬ng tr×nh tr«ng gièng

Page 111: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

thÕ nµy:sub bigger_than {

local ($n, @values) ; # t¹o ra c¸c biÕn côc bé nµo ®ã($n, @values) = @_ ; # chÆt arg thµnh giíi h¹n vµ gi¸ trÞlocal (@result) ; # t¹m thêi gi÷ gi¸ trÞ tr¶ l¹iforeach $_ (@values) { # ®i qua danh s¸ch ®èi arg

if ($_ > $n) { # cã ®ñ t c¸ch kh«ng?push (@result, $_) ; # céng nã

}$result ; # cho l¹i danh s¸ch cuèi

}# mét sè lêi gäi@new = &bigger_than (100, @list); # @new nhËn tÊt c¶

@list > 100@this = &bigger_than(5,1,5,15,30); # @this nhËn (15,30)L ý r»ng lÇn nµy t«i ®· dïng hai biÕn côc bé phô ®Ó ®Æt tªn

cho c¸c ®èi. §iÒu nµy kh¸ th«ng dông trong thùc hµnh - dÔ nãi vÒ $n vµ @values h¬n nãi vÒ $_[0] vµ @_[1..$#_] nhiÒu l¾m.

KÕt qu¶ cña local() lµ mét danh s¸ch g¸n ®îc, nghÜa lµ nã cã thÓ ®îc dïng ë vÕ bªn tr¸i cña to¸n tö g¸n m¶ng. Danh s¸ch nµy cã thÓ ®îc ®Æt gi¸ trÞ khëi ®Çu cho tõng biÕn míi ®îc t¹o ra. (NÕu b¹n kh«ng ®Æt gi¸ trÞ cho danh s¸ch nµy, th× c¸c biÕn míi b¾t ®Çu víi mét gi¸ trÞ cña undef, gièng nh bÊt k× biÕn míi nµo kh¸c.) §iÒu nµy cã nghÜa lµ chóng ta cã thÓ tæ hîp hai c©u lÖnh ®Çu cña tr×nh con nµy, b»ng c¸ch thay thÕ:

local ($n, @values) ; ($n, @values) = @_ ; # chÆt arg thµnh giíi h¹n vµ gi¸ trÞ

b»nglocal ($n, @values) = @_ ;

Trong thùc tÕ, ®©y lµ mét thø rÊt ®Æc thï th«ng dông Perl còng hÖt nhu khai b¸o vËy, local() thùc sù lµ mét to¸n tö thùc hiÖn ®îc. NÕu b¹n ®Æt nã vµo bªn trong chu tr×nh, th× b¹n sÏ thu ®îc mét biÕn míi cho mçi lÇn lÆp chu tr×nh, mµ gÇn nh lµ v« dông trõ phi b¹n thÝch l·ng phÝ bé nhí vµ quªn mÊt m×nh ®· tÝnh g× trong lÇn lÆp tríc. ChiÕn lîc lËp tr×nh Perl tèt gîi ý r»ng b¹n nªn nhãm tÊt c¶ c¸c to¸n tö local() cña m×nh vµo phÇn ®Çu ®Þnh nghÜa tr×nh con, tríc khi b¹n chui vµo phÇn thÞt cña tr×nh nµy.Bµi tËp1. H·y viÕt mét tr×nh con nhËn mét gi¸ trÞ sè tõ 1 tíi 9 vµ cho

l¹i tªn tiÕng Anh (nh mét, hai, hay chÝn). NÕu gi¸ trÞ ®a vµo

Page 112: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

ë ngoµi ph¹m vi nµy, th× h·y cho l¹i sè ban ®Çu tahy v× cho tªn. H·y thö nã víi mét sè d÷ liÖu vµo - cã lÏ b¹n sÏ ph¶i viÕt ra mét lo¹i khiÓn tr×nh nµo ®ã.

2. H·y lÊy ch¬ng tr×nh trong bµi tËp tríc, viÕt mét ch¬ng tr×nh nhËn hai sè vµ céng chóng l¹i, hiÓn thÞ kÕt qu¶ kiÓu “hai céng hai lµ bèn.” (Chí quªn viÕt hoa tõ ®Çu!)

3. H·y më réng tr×nh con nµy ®Ó cho l¹i ©m chÝn qua ©m mét vµ kh«ng. H·y thö ch¬ng tr×nh nµy.

Page 113: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

9

C¸c cÊu tróc

®iÒu khiÓn kh¸c

To¸n tö lastTrong mét sè bµi tËp tríc ®©y b¹n cã thÓ ®· nghÜ, “NÕu t«i

cã ®îc mét c©u lÖnh break cña C ë ®©y, th× ®· xong råi.” Cho dï b¹n kh«ng nghÜ nh thÕ, th× h·y cø ®Ó t«i nãi cho b¹n vÒ sù t¬ng ®¬ng cña Perl ®Ó tho¸t sím khái chu tr×nh : to¸n tö last.

To¸n tö last ng¾t khèi chu tr×nh bao quanh ë bªn trong nhÊt, g©y ra viÖc thùc hiÖn tiÕp tôc víi c©u lÖnh ®i ngay sau khèi ®ã. Ch¼ng h¹n:

while (c¸i g× ®ã) {c¸i g× ®ã ;c¸i g× ®ã ;c¸i g× ®ã ;if (®iÒu kiÖn nµo ®ã) {

c¸i g× ®ã kh¸c ;c¸i g× ®ã kh¸c ;last ; # nhÈy ra khái chu tr×nh while

}thªm n÷a ;thªm n÷a ;

}# last nhÈy tíi ®©yNÕu ®iÒu kiÖn nµo ®ã lµ ®óng, th× c¸i g× ®ã kh¸c sÏ ®îc

thùc hiÖn, vµ thÕ råi to¸n tö last buéc chu tr×nh while ph¶i kÕt thóc.

To¸n tö last chØ tÝnh tíi khèi chu tr×nh, kh«ng tÝnh khèi cÇn ®Ó t¹o nªn kÕt cÊu có ph¸p nµo ®ã. §iÒu nµy cã nghÜa lµ khèi t¹o nªn nh¸nh then cña c©u lÖnh if kh«ng ®îc tÝnh tíi - chØ khèi t¹o nªn for, foreach, while vµ c¸c khèi ‘trÇn” míi ®îc tÝnh. (Khèi trÇn lµ khèi kh«ng thuéc phÇn kh¸c cña mét kÕt cÊu lín

Trong ch¬ng nµy: To¸n tö last To¸n tö next To¸n tö redo Khèi cã nh·n Bé thay ®æi

biÓu thøc &&, || vµ ?:

xem nh c¸c cÊu tróc ®iÒu khiÓn

Page 114: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

h¬n, nh mét chu tr×nh, hay mét tr×nh con, hay mét c©u lÖnh if/then/else).

Gi¶ sö t«i muèn xem liÖu th«ng b¸o th ®· ®îc cÊt gi÷ trong mét tÖp cã lµ tõ t«i hay kh«ng. Mét th«ng b¸o nh vËy cã thÓ gièng nh lµ:

From: [email protected] (Randal L. Schwartz)To: [email protected]: 01-SEP-93 08:16:24 PM PDT - 0700Subject: A sample mail message

Here’s the body of the mail message. And here is some more.

T«i ph¶i duyÖt qua th«ng b¸o nµy tõ dßng b¾t ®Çu víi From: vµ råi ®Ó ý liÖu dßng nµy cã chøa tªn ®¨ng nhËp cña t«i hay kh«ng, merlyn.

T«i cã thÓ lµm ®iÒu ®ã nh thÕ nµy:while (<STDIN>) { # ®äc dßng vµo

if (/^From:/) { # nã cã b¾t ®Çu víi From: kh«ng? NÕu cã...

if (/merlyn/) { # nã lµ tõ t«i!print “Email from Randal! It’s about time!\n”;

}last ; # kh«ng cÇn t×m From: n÷a, cho nªn ra

} # kÕt thóc “if from:”if (/^$/) { # dßng trèng ?

last ; # nÕu ®óng thÕ th× ®õng kiÓm tra thªm n÷a}

} # kÕt thóc whileLu ý r»ng mét khi dßng cã chøa From: ®îc t×m thÊy th×

chóng ta ®i ra khái chu tr×nh chÝnh bëi v× t«i muèn xem chØ dßng From: ®Çu tiªn. Còng lu ý r»ng mét ®Çu ®Ò th kÕt thóc t¹i dßng trèng ®Çu tiªn, cho nªn chóng ta cã thÓ ra khái chu tr×nh chÝnh n÷a.To¸n tö next

Gièng nh last, next còng lµm thay ®æi luång thùc hiÖn theo tr×nh tù th«ng thêng. Tuy nhiªn, to¸n tö next lµm cho viÖc thùc hiÖn bá qua phÇn cßn l¹i cña khèi chu tr×nh ®îc bao bªn trong nhÊt mµ kh«ng kÕt thóc khèi nµy* . Nã ®îc dïng nh thÕ nµy:

while (c¸i g× ®ã) {* NÕu cã mét khèi continue cho chu tr×nh nµy, mµ chóng ta th× cha th¶o luËn tíi, th× to¸n tö next ®i tíi chç b¾t ®Çu cña khèi continue thay v× tíi cuèi khèi nµy. Kh¸ gÇn.

Page 115: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

phÇn thø nhÊt ;phÇn thø nhÊt ;phÇn thø nhÊt ;if (®iÒu kiÖn nµo ®ã) {

phÇn nµo ®ã ;phÇn nµo ®ã ;next ; # nhÈy ra khái chu tr×nh while

}phÇn kh¸c ;phÇn kh¸c ;# next tíi ®©y

}NÕu ®iÒu kiÖn nµo ®ã lµ ®óng, th× phÇn nµo ®ã ®îc thùc

hiÖn, vµ phÇn kh¸c bÞ bá qua.LÇn n÷a, khèi cña mét c©u lÖnh if kh«ng ®îc tÝnh tíi nh

khèi chu tr×nh.To¸n tö redo

C¸ch thø ba mµ b¹n cã thÓ nhÈy qua trong mét khèi chu tr×nh lµ b»ng redo. To¸n tö nµy nhÈy tíi chç b¾t ®Çu cña khèi hiÖn t¹i (kh«ng tÝnh l¹i biÓu thøc ®iÒu kiÖn), kiÓu nh:

while (c¸i g× ®ã) {# redo tíi ®©yc¸i g× ®ã ;c¸i g× ®ã ;c¸i g× ®ã ;if (®iÒu kiÖn nµo ®ã) {

phÇn nµo ®ã ;phÇn nµo ®ã ;redo ;

}phÇn kh¸c ;phÇn kh¸c ;phÇn kh¸c ;

}Mét lÇn n÷a, khèi if kh«ng ®îc tÝnh tíi. ChØ tÝnh c¸c khèi

chu tr×nh.L ý r»ng víi redo vµ last vµ khèi trÇn, b¹n cã thÓ t¹o nªn chu

tr×nh v« h¹n mµ ®i ra tõ gi÷a, kiÓu nh:{

phÇn b¾t ®Çu ;phÇn b¾t ®Çu ;

Page 116: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

phÇn b¾t ®Çu ;if (®iÒu kiÖn nµo ®ã) {

last ; }phÇn sau ;phÇn sau ;phÇn sau ;redo ;

}§iÒu nµy sÏ phï hîp cho mét chu tr×nh kiÓu while mµ cÇn tíi

viÖc cã mét phÇn nµo ®ã cña chu tr×nh nµy ®îc thùc hiÖn nh viÖc khëi ®Çu tríc phÐp kiÓm thö thø nhÊt. (Trong môc “Bé thay ®æi biÓu thøc”, díi ®©y, t«i sÏ chØ ra cho b¹n c¸ch viÕt c©u lÖnh if víi Ýt kÝ tù ng¾t h¬n.)Khèi cã nh·n

§iÒu g× x¶y ra nÕu b¹n muèn nhÈy ra khæi mét khèi cã chøa khèi bªn trong nhÊt, hay nãi theo c¸ch kh¸c, ra khái hai khèi lång nhau ngay mét lóc? Trong C, b¹n ph¶i viÖn tíi to¸n tö goto ®Ó ®i ra. Kh«ng cÇn ph¶i lµm nhu vËy trong Perl - b¹n cã thÓ dïng last, next vµ redo t¹i bÊt k× khèi kÕt nµo b»ng viÖc cho khèi mét c¸i tªn cã nh·n.

Nh·n lµ mét kiÓu tªn kh¸c tõ mét kh«ng gian tªn kh¸c mµ tu©n theo cïng qui t¾c nh v« híng, m¶ng, m¶ng kÕt hîp vµ tr×nh con. Tuy nhiªn, nh chóng ta thÊy, mét nh·n kh«ng cã kÝ tù ng¾t ®i ®Çu ®Æc biÖt (nh $ cho v« híng, & cho tr×nh con, v©n v©n), cho nªn mét nh·n cã tªn print sÏ xung ®ét víi tõ dµnh riªng print vµ sÏ kh«ng ®îc phÐp. Bëi lÝ do nµy, Larry gîi ý b¹n h·y chän c¸c nh·n bao gåm toµn ch÷ hoa vµ sè, mµ anh Êy ®¶m b¶o sÏ kh«ng bao giê bÞ chän nhÇm thµnh mét tõ dµnh riªng trong t¬ng lai. Bªn c¹nh ®ã, tÊt c¶ c¸c chø hoa cho phÐp dÔ nh×n thÊy h¬n trong mét v¨n b¶n ch¬ng tr×nh mµ phÇn lín lµ ch÷ thêng.

Mét khi b¹n ®· chän cÈn thËn nh·n, th× nã sÏ ®øng ngay tríc c©u lÖnh cã chøa khèi, theo sau dÊu hai chÊm, kiÓu nh thÕ nµy:

SOMELABEL: while (®iÒu kiÖn) {c©u lÖnh ;c©u lÖnh ;c©u lÖnh ;if (®iÒu kiÖn kh¸c) {

last SOMELABEL ;

Page 117: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}}L ý r»ng t«i ®· thªm SOMELABEL, nh mét tham biÕn vµo

c©u lÖnh last. Tham biÕn nµy b¶o cho Perl ra khái khèi cã tªn SOMELABEL, thay v× ra khái khèi bªn trong nhÊt. Trong trêng hîp nµy, chóng ta kh«ng cã c¸i g× kh¸c ngoµi khèi bªn trong nhÊt. Nhng gi¶ sö t«i cã c¸c chu tr×nh lång nhau:

OUTER: for ($i = 1; $i <= 10 ; $i++) {INNER: for ($j = 1 ; $j >= 10 ; $j++) {

if ($i + $j == 63) {print “$i lÇn $j lµ 63!\n” ;last OUTER;

}if ($j >= $i) {

next OUTER ;}

}}TËp hîp c¸c c©u lÖnh nµy thö tÊt c¶ c¸c gi¸ trÞ kÕ tiÕp cña

hai sè nhá nhÊt ®îc nh©n víi nhau cho tíi khi nã t×m ra mét cÆp cã tÝch lµ 63 (7 vµ 9). Lu ý r»ng mét khi ®· t×m ®îc mét cÆp th× kh«ng cÇn ph¶i kiÓm tra c¸c sè kh¸c n÷a, cho nªn c©u lÖnh if thø nhÊt ra khái c¶ hai chu tr×nh for b»ng viÖc dïng last víi nh·n. C©u lÖnh if thø hai cè g¾ng ®¶m b¶o r»ng sè lín h¬n trong hai sè bao giê còng lµ sè thø nhÊt b»ng viÖc bá qua viÖc lÆp tiÕp cña chu tr×nh bªn ngoµi ngay khi ®iÒu kiÖn nµy kh«ng cßn x¶y ra n÷a. §iÒu nµy cã nghÜa lµ c¸c sè sÏ ®îc kiÓm thö víi ($i, $j) lµ (1,1), (2,1), (2,2), (3,1), (3,2), (3,3), (4,1) v©n v©n.

Cho dï khèi bªn trong nhÊt ®îc g¾n nh·n, th× c¸c to¸n tö last, next, vµ redo kh«ng cã tham biÕn tuú chän (nh·n) vÉn vËn hµnh t«n träng khèi bªn trong nhÊt. Còng vËy, b¹n kh«ng thÓ dïng nh·n ®Ó nhÈy vµo trong mét khèi - chØ ®Ó nhÈy ra khèi. C¸c to¸n tö last, next hay redo ph¶i ë bªn trong khèi.Bé thay ®æi biÓu thøc

Xem nh mét c¸ch kh¸c ®Ó chØ ra “nÕu thÕ nµy, th× thÕ kia,” Perl cho phÐp b¹n g¾n nh·n cho mét bé söa ®æi if lªn mét biÓu thøc vèn lµ mét biÓu thøc ®øng riªng. KiÓu nh:

biÓu thøc nµo ®ã if biÓu thøc ®iÒu khiÓn ;Trong trêng hîp nµy, biÓu thøc ®iÒu khiÓn ®îc tÝnh tríc ®Ó

xÐt gi¸ trÞ ch©n lÝ cña nã (b»ng viÖc dïng cïng qui t¾c nh th-

Page 118: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

êng lÖ), vµ nÕu ®óng, th× biÓu thøc nµo ®ã sÏ ®îc tÝnh tiÕp. §iÒu nµy ®¹i thÓ t¬ng ®¬ng víi:

if (biÓu thøc ®iÒu khiÓn nµo ®ã) {biÓu thøc nµo ®ã ;

}ngo¹i trõ r»ng b¹n kh«ng cÇn thªm dÊu ng¾t phô, c©u lÖnh

nµy ®äc ngîc l¹i, vµ biÓu thøc ph¶i lµ mét biÓu thøc ®¬n (kh«ng ph¶i lµ mét khèi c©u lÖnh). Tuy nhiªn, nhiÒu lÇn c¸ch m« t¶ ngîc nµy lahi biÕn thµnh c¸ch tù nhiªn nhÊt ®Ó ph¸t biÓu vÊn ®Ò, trong khi còng tiÕt kiÖm ®îc vµi nh¸t gâ. Ch¼ng h¹n, sau ®©y lµ c¸ch b¹n cã thÓ ra khái chu tr×nh khi mét ®iÒu kiÖn nµo ®ã n¶y sinh:

LINE: while (<STDIN>) {last LINE if /^From: / ;

}B¹n xem dÔ viÕt lµm sao. Vµ b¹n thËm chÝ cßn cã thÓ ®äc

nã theo kiÓu tiÕng Anh: “dßng cuèi nÕu nã b¾t ®Çu víi From.”C¸c d¹ng song song kh¸c bao gåm nh÷ng d¹ng sau:exp2 unless exp1; # gièng: unless (exp1) { exp2 ; }exp2 while exp1; # gièng: while (exp1) { exp2 ; }exp2 until exp1; # gièng: util (exp1) { exp2 ; }L ý r»ng tÊt c¶ c¸c d¹ng nµy ®Òu tÝnh exp1 tríc råi dùa trªn

®ã, tÝnh hay kh«ng tÝnh c¸i g× ®ã víi exp2.Ch¼ng h¹n, sau ®©y lµ c¸ch t×m ra luü thõa ®Çu tiªn cña

hai sè lín h¬n mét sè ®· cho:chop ($n = <STDIN>) ;$i = 1; # khëi ®Çu$i *= 2 until $i > $n ; # lÆp cho tíi khi ta t×m ra nã.C¸c d¹ng nµy kh«ng lång nhau - b¹n kh«ng thÓ nãi ®îc exp3

while exp2 if exp1. §iÒu nµy lµ v× d¹ng exp2 if exp1 kh«ng cßn lµ mét biÓu thøc, mµ lµ mét c©u lÖnh hoµn toµn, vµ b¹n kh«ng thÓ g¾n thªm mét trong c¸c bé söa ®æi nµy vµo sau c©u lÖnh.&&, || vµ ?: xem nh c¸c cÊu tróc ®iÒu khiÓn

Nh÷ng cÊu tróc nµy tr«ng tùa nh c¸c kÝ tù ng¾t, hay mét phÇn cña biÓu thøc. LiÖu chóng cã thÓ thùc sù ®îc coi lµ c¸c cÊu tróc ®iÒu khiÓn kh«ng? ThÕ nµy, theo c¸ch nghÜ Perl, gÇn nh bÊt k× c¸i g× còng ®Òu cã thÓ c¶, cho nªn b¹n h·y xem ®iÒu t«i nãi ë ®©y.

Page 119: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Th«ng thêng, b¹n b¾t gÆp “nÕu c¸i nµy, th× c¸i nä.” Tríc ®©y chóng ta ®· thÊy hai d¹ng nµy:

if (c¸i nµy) { c¸i nä ; } # mét c¸chc¸i nä if c¸i nµy ; # c¸ch kh¸c§©y lµ c¸ch thø ba (vµ h·y tin t«i ®i, vÉn cßn n÷a ®Êy):c¸i nµy && c¸i nä ;T¹i sao nã l¹i lµm viÖc? Nã ch¼ng ph¶i lµ to¸n tö logic vµ

sao? B¹n h·y kiÓm tra xem c¸i g× x¶y ra khi c¸i nµy lÊy gi¸ trÞ ®óng hay sai: NÕu c¸i nµy lµ ®óng, thÕ th× gi¸ trÞ cña toµn bé biÓu thøc

vÉn cßn cha ®îc biÕt tíi, v× nã phô thuéc vµo gi¸ trÞ cña c¸i nä. Cho nªn c¸i nä ph¶i ®îc tÝnh.

NÕu c¸i nµy lµ sai, thÕ th× ch¼ng cÇn g× mµ nh×n vµo c¸i nä n÷a, bëi v× gi¸ trÞ cña toµn bé biÓu thøc ph¶i lµ sai råi. V× ch¼ng cÇn g× ph¶i tÝnh c¸i nä nªn chóng ta cã thÓ bá qua.Vµ trong thùc tÕ, ®©y lµ ®iÒu mµ Perl lµm. Perl tÝnh c¸i nä

chØ khi c¸i nµy lµ ®óng, lµm cho nã thµnh t¬ng ®¬ng víi hai d¹ng tríc.

Gièng thÕ, to¸n tö logic hoÆc gièng nh c©u lÖnh unless (hay bé söa ®æi unless). Cho nªn b¹n cã thÓ thay thÕ:

unless (c¸i nµy) { c¸i nä ; }b»ng c¸i nµy || c¸i nä ;NÕu b¹n quen thuéc víi viÖc dïng c¸c to¸n tö nµy trong líp vá

®Ó kiÓm so¸t c¸c chØ lÖnh thùc hiÖn ®iÒu kiÖn, th× b¹n sÏ thÊy r»ng chóng vËn hµnh t¬ng tù trong Perl.

Cuèi cïng to¸n tö ba ng«i kiÓu C:exp1 ? exp2 : exp3 ;tÝnh exp2 nÕu exp1 ®óng, ngîc l¹i tÝnh exp3. Còng dêng nh

lµ chóng ta nãi:if (exp1) { exp2 ; } else { exp3 ; }nhng mét lÇn n÷a kh«ng cã tÊt c¶ c¸c dÊu ng¾t ®ã. Ch¼ng

h¹n, b¹n cã thÓ viÕt:($a < 10) ? $b = $a : $a = $b ;Ta nªn dïng c¸i nµo ®©y? Tuú vµo t©m tr¹ng b¹n th«i, ®«i

khi, hay tuú theo tõng phÇn biÓu thøc lín ®Õn ®©u, hay liÖu ta cÇn thªm ®ãng më ngoÆc nµo bëi v× sù xung kh¾c thø tù u

Page 120: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

tiªn. B¹n h·y nh×n vµo ch¬ng tr×nh cña ngêi kh¸c vµ xem chóng lµm g×. Cã lÏ b¹n sÏ thÊy ®«i ®iÒu ë ®ã. Larry gîi ý r»ng b¹n h·y ®Æt phÇn quan träng nhÊt cña biÓu thøc lªn tríc, ®Ó cho nã næi bËt ra.Bµi tËp1. H·y më réng bµi to¸n cña ch¬ng tríc ®Ó lÆp l¹i phÐp to¸n

®ã cho tíi khi tõ end ®îc ®a vµo cho mét trong c¸c gi¸ trÞ. (Híng dÉn: b¹n h·y dïng mét chu tr×nh v« h¹n, vµ råi thùc hiÖn last nÕu gi¸ trÞ ®a vµo lµ end.)

Page 121: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

10

Tíc hiÖu tÖp

vµ kiÓm thö tÖp

Tíc hiÖu tÖp lµ g×?Tíc hiÖu tÖp lµ tªn trong mét ch¬ng tr×nh Perl dµnh cho

viÖc nèi gi÷a tiÕn tr×nh Perl cña b¹n vµ thÕ giíi bªn ngoµi. Chóng ta ®· thÊy vµ dïng tíc hiÖu tÖp mét c¸ch kh«ng têng minh: STDIN lµ mét tíc hiÖu tÖp, ®Æt tªn cho viÖc nèi gi÷a tiÕn tr×nh Perl vµ lèi vµo chuÈn cña UNIX. Gièng nh vËy, Perl cung cÊp STDOUT (cho lèi ra chuÈn) vµ STDERR (cho lèi ra chuÈn cho lçi). Nh÷ng tªn nµy lµ trïng víi c¸c tªn ®îc dïng trong bé tr×nh th viÖn “vµo/ra chuÈn” cña UNIX, Perl dïng chóng cho hÇu hÕt viÖc vµo/ra.

Tªn tíc hiÖu tÖp còng gièng nh tªn dµnh cho c¸c khèi cã nh·n, nhng chóng ®Õn tõ mét kh«ng gian tªn kh¸c (cho nªn b¹n cã thÓ cã mét v« híng $fred, mét m¶ng @fred, mét m¶ng kÕt hîp %fred, mét ch¬ng tr×nh con &fred, mét nh·n fred, vµ b©y giê mét tíc hiÖu tÖp fred). Gièng nh nh·n khèi, tíc hiÖu tÖp ®îc dïng kh«ng cÇn mét kÝ tù ®Æc biÖt ®øng tríc, vµ do vËy cã thÓ bÞ lÉn lén víi c¸c tõ dµnh riªng hiÖn cã hay trong t¬ng lai. Mét lÇn n÷a, khuyÕn c¸o cña Larry lµ b¹n h·y dïng tÊt c¶ c¸c ch÷ hoa trong tíc hiÖu tÖp cña m×nh - kh«ng chØ nã biÓu thÞ tèt h¬n, mµ nã còng sÏ ®¶m b¶o r»ng ch¬ng tr×nh cña b¹n sÏ kh«ng háng khi c¸c tõ dµnh riªng t¬ng lai ®îc ®a vµo.Më vµ ®ãng mét tíc hiÖu tÖp

Perl cung cÊp ba tíc hiÖu tÖp, STDIN, STDOUT, STDERR, mµ tù ®éng më cho c¸c tÖp hay thiÕt bÞ do tiÕn tr×nh cha mÑ cña ch¬ng tr×nh nµy ®· thiÕt lËp (cã thÓ lµ líp vá). B¹n dïng to¸n tö open() ®Ó më c¸c tíc hiÖu tÖp phô, hÖt nh b¹n lµm trong ch-¬ng tr×nh ®îc viÕt trong C. Có ph¸p cña nã gièng thÕ nµy:

open (FILEHANDLE, “tªn nµo ®ã”);

Trong ch¬ng nµy: Tíc hiÖu

tÖp lµ g×? Më vµ

®ãng tíc hiÖu tÖp

die() Dïng tíc

hiÖu KiÓm thö

tÖp -x C¸c to¸n tö

stat() vµ lstat()

Page 122: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

víi FILEHANDLE lµ tíc hiÖu tÖp míi, cßn tªn nµo ®ã lµ tªn tÖp UNIX ngoµi (nh mét tÖp hay thiÕt bÞ) mµ sÏ ®îc liªn kÕt víi tíc hiÖu tÖp míi. ViÖc gäi nµy më tíc hiÖu tÖp ®Ó ®äc. ViÖc më mét tÖp ®Ó ghi th× cung dïng cïng to¸n tö open, nhng phÇn tiÒn tè cña tªn tÖp cã mét dÊu lín h¬n (nh trong vá):

open (OUT, “>outfile”);Chóng ta sÏ thÊy trong môc “Dïng tíc hiÖu tÖp,” díi ®©y

c¸ch sö dông tíc hiÖu tÖp nµy. Còng vËy, nh trong vá, b¹n cã thÓ më mét tÖp ®Ó thªm vµo sau b»ng viÖc dïng hai dÊu lín h¬n lµm tiÒn tè, nh trong:

open (LOGFILE, “>>mylogfile”);TÊt c¶ ba d¹ng nµy cña open ®Òu cho l¹i ®óng nÕu viÖc më

thµnh c«ng vµ sai nÕu thÊt b¹i. (ViÖc më mét tÖp ®a vµo sÏ sai, ch¼ng h¹n, nÕu tÖp ®ã kh«ng cã hay kh«ng thÓ th©m nhËp tíi ®îc bëi kh«ng ®îc phÐp; viÖc më tÖp ®a sÏ sai nÕu danh môc kh«ng cho ghi hay kh«ng cho th©m nhËp tíi.)

Khi b¹n kÕt thóc víi mét tíc hiÖu tÖp, b¹n cã thÓ ®ãng nã b»ng to¸n tö close, tùa nh:

close(LOGFILE);ViÖc më l¹i mét tíc hiÖu tÖp còng lµm ®ãng tÖp më tríc ®ã

mét c¸ch tù ®éng, còng nhu khi ra khái ch¬ng tr×nh. V× ®iÒu nµy, phÇn lín c¸c ch¬ng tr×nh Perl kh«ng bËn t©m víi close(). Nhng nã vÉn cã ®ã nÕu b¹n muèn ®îc chÆt chÏ hay ch¾c ch¾n r»ng tÊt c¶ d÷ liÖu ®Òu ®îc ®Èy ra hÕt ®«i khi sím h¬n viÖc kÕt thóc cña ch¬ng tr×nh.Mét chót tiªu khiÓn: die()

Ta h·y coi ®©y nh lµ mét chó thÝch cuèi trang lín, nhng l¹i n»m ë gi÷a trang.

Mét tíc hiÖu tÖp mµ kh«ng ®îc më thµnh c«ng th× cã thÓ vÉn ®îc dïng mµ thËm chÝ kh«ng g©y ra c¶nh b¸o g× nhiÒu l¾m trong toµn bé ch¬ng tr×nh. NÕu b¹n ®äc tõ tíc hiÖu tÖp th× b¹n sÏ nhËn ®îc ngay cuèi tÖp. NÕu b¹n ghi lªn tíc hiÖu tÖp th× d÷ liÖu cø im Øm bÞ bá ®i (gièng nh lêi høa hÑn vËn ®éng bÇu cö n¨m tríc).

Thêng b¹n muèn kiÓm tra l¹i kÕt qu¶ cña viÖc më tÖp vµ b¸o c¸o l¹i lçi nÕu kÕt qu¶ kh«ng ph¶i lµ ®iÒu b¹n dù kiÕn. Ch¾c ch¾n, b¹n cã thÓ r¶i r¾c trong ch¬ng tr×nh cña m×nh víi nh÷ng thø kiÓu nh:

unless (open(DATAPLACE, “>/tmp/dataplace”)) {

Page 123: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

print “RÊt tiÕc, t«i kh«ng thÓ t¹o ®îc /tmp/dataplace\n”;} else {

# phÇn cßn l¹i ch¬ng tr×nh cña b¹n}Nhng ®Êy lµ c¶ ®èng viÖc. Vµ ®iÒu thêng xÈy ra víi Perl lµ

®a ra mét lèi t¾t. To¸n tö die() lÊy mét danh s¸ch bªn trong dÊu ngoÆc trßn tuú chän, phun ra danh s¸ch ®ã (gièng nh print) trªn lèi ra lçi chuÈn, vµ råi kÕt thóc tiÕn tr×nh Perl (tiÕn tr×nh ®ang ch¹y ch¬ng tr×nh Perl) víi mét tr¹ng th¸i ra kh¸c kh«ng cña UNIX (nãi chung chØ ra mét c¸i g× ®ã bÊt thêng xÈy ra). Cho nªn, viÕt l¹i ®o¹n m· trªn th× ta sÏ thÊy nã gièng nh thÕ nµy:

unless (open(DATAPLACE, “>/tmp/dataplace”)) {die “RÊt tiÕc, t«i kh«ng thÓ t¹o ®îc /tmp/dataplace\n”;

}# phÇn cßn l¹i ch¬ng tr×nh cña b¹n

Nhng chóng ta thËm chÝ cßn cã thÓ ®i thªm mét bíc n÷a. Nhí r»ng ta cã thÓ dïng to¸n tö (logic hoÆc) || ®Ó lµm ng¾n thªm ®iÒu nµy, nh trong

unless (open(DATAPLACE, “>/tmp/dataplace”)) ||die “RÊt tiÕc, t«i kh«ng thÓ t¹o ®îc /tmp/dataplace\n”;

VËy die sÏ ®îc thùc hiÖn chØ khi kÕt qu¶ cña open lµ sai. C¸ch th«ng dông ®Ó ®äc ®iÒu nµy lµ “h·y më tÖp ®ã ra nÕu kh«ng th× chÕt qu¸ch ®i cho råi!” vµ ®ã lµ c¸ch dÔ dµng ®Ó nhí bÊt k× khi nµo dïng to¸n tö logic vµ hay logic hoÆc.

Th«ng b¸o vµo lóc chÕt (®îc x©y dùng tõ ®èi cña die) cã tªn ch¬ng tr×nh Perl vµ sè dßng ®îc g¾n tù ®éng vµo, cho nªn b¹n cã thÓ dÔ dµng x¸c ®Þnh ®îc die nµo trong ch¬ng tr×nh cña b¹n chÞu tr¸ch nhiÖm cho viÖc ra kh«ng ®óng lóc nµy. NÕu b¹n kh«ng thÝch sè dßng hay tÖp bÞ lé ra, th× ph¶i ch¾c ch¾n r»ng v¨n b¶n chÕt cã mét dÊu dßng míi ë cuèi. Ch¼ng h¹n:

die “b¹n nÊu níc xèt - lîn s÷a”;sÏ in ra tªn tÖp vµ sè dßng, trong khidie “b¹n nÊu níc xèt - lîn s÷a\n”;th× kh«ng in ra tªn tÖp vµ sè dßng.

Dïng tíc hiÖu tÖpMét khi tíc hiÖu tÖp ®îc më ra ®Ó ®äc th× b¹n cã thÓ ®äc

c¸c dßng tõ nã hÖt nh b¹n cã thÓ ®äc tõ lèi vµo chuÈn víi

Page 124: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

STDIN. VËy, ch¼ng h¹n, ®Ó ®äc c¸c dßng tõ tÖp mËt hiÖu:open (EP, “/etc/passwd”);while (<EP>) {

chop;print “T«i thÊy $_ trong tÖp mËt hiÖu!\n”;

}Lu ý r»ng tíc hiÖu tÖp míi më ®îc dïng bªn trong dÊu ngoÆc

nhän hÖt nh ta ®· dïng STDIN tríc ®©y.Mét tíc hiÖu tÖp më ra ®Ó ghi hay hiÖu ®Ýnh ®Òu ph¶i ®îc

cho nh mét ®èi cña to¸n tö print, xuÊt hiÖn ngay sau tõ kho¸ print nhng tríc danh s¸ch ®èi:

print LOGFILE “Kho¶n môc kÕt thóc cña $max\n”;print STDOUT “Xin chµo, mäi ngêi!\n”; # gièng nh in “xin

chµo mäi ngêi!\n”Trong trêng hîp nµy, th«ng b¸o b¾t ®Çu víi Kho¶n môc kÕt

thóc sÏ ghi lªn tíc hiÖu tÖp LOGFILE, mµ gi¶ thiÕt lµ ®· më tríc ®©y trong ch¬ng tr×nh. Vµ xin chµo mäi ngêi sÏ ®i ra lèi ra chuÈn, hÖt nh khi b¹n kh«ng x¸c ®Þnh tíc hiÖu tÖp. Chóng ta nãi r»ng STDOUT lµ tíc hiÖu xö lÝ tÖp ngÇm ®Þnh cho c©u lÖnh print.

VËy, tãm l¹i, sau ®©y lµ c¸ch ®Ó sao chÐp tÊt c¶ v¨n b¶n tõ mét tÖp ®îc x¸c ®Þnh trong $a vµo mét tÖp ®îc x¸c ®Þnh trong $b. Nã minh ho¹ gÇn nh mäi thø mµ ta ®· häc trong vµi trang võa qua:

open (IN,$a) || die “kh«ng thÓ më ®îc $a ®Ó ®äc”;open (OUT, “>$b”) || die “kh«ng thÓ t¹o dîc $b”;while (<IN>) { # ®äc mét dßng tõ tÖp $a vµo $_

print OUT $_; # in dßng ®ã vµo tÖp $b}close(IN);close(OUT);

KiÓm tra tÖp -xB©y giê b¹n ®· biÕt c¸ch ®Ó më mét tíc hiÖu tÖp ®Ó ghi

ra, viÕt ®Ì lªn bÊt k× tÖp hiÖn cã nµo víi cïng tªn. Gi¶ sö b¹n muèn ch¾c ch¾n r»ng kh«ng cã mét tÖp nµo víi tªn ®ã (®Ó gi÷ cho b¹n khái ngÉu nhiªn lµm mÊt tiªu d÷ liÖu b¶ng tÝnh hay lÞch ngµy sinh quan träng). NÕu b¹n ®Þnh viÕt mét b¶n ghi vá th× b¹n nªn dïng c¸i g× ®ã tùa nh -e tªn tÖp ®Ó kiÓm tra liÖu tÖp ®ã cã tån t¹i hay kh«ng. T¬ng tù thÕ, Perl dïng -e $filevar ®Ó kiÓm tra sù tån t¹i cña tÖp mang tªn bëi gi¸ trÞ v« híng

Page 125: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

$filevar. NÕu tÖp nµy tån t¹i th× kÕt qu¶ lµ ®óng; ngîc l¹i nã lµ sai. Ch¼ng h¹n:

$x = “/etc/passwd”;if (-e $x) { # liÖu /etc/passwd cã tån t¹i kh«ng?

# tèt} else {

print “how in the world did you get logged in?\n”;}To¸n h¹ng cña to¸n tö -e thùc sù lµ bÊt k× biÓu thøc v« híng

nµo tÝnh mét x©u nµo ®ã, kÓ c¶ mét x©u h»ng. Sau ®©y lµ mét thÝ dô kiÓm tra cho c¶ mËt hiÖu hÖ thèng vµ tÖp nhãm:

if (-e “/etc/passwd && -e “/etc/group”) {print “looks like you have a normal system\n”;

C¸c to¸n tö kh¸c còng ®îc x¸c ®Þnh râ. Ch¼ng h¹n, -r $filevar cho l¹i gi¸ trÞ ®óng nÕu tÖp ®·cã tªn trong $filevar ®ang tån t¹i vµ ®äc ®îc. T¬ng tù, -w $filevar kiÓm tra xem liÖu cã ghi ®îc ®îc kh«ng. Sau ®©y lµ mét thÝ dô kiÓm tra tªn tÖp do ngêi dïng x¸c ®Þnh cho c¶ tÝnh ®äc ®îc vµ ghi ®îc:

print “ë ®©u? “;$filename = <STDIN>;chop($filename); # qu¼ng c¸i dÊu dßng míi khã chÞu ®iif (-r $filename && -w $filename) {

# tÖp ®· cã, vµ t«i cã thÓ ®äc vµ ghi nã...

}NhiÒu viÖc kiÓm tra tÖp ®·cã s½n. Xin xem B¶ng 10-1 ®Ó

biÕt danh s¸ch ®Çy ®ñ.B¶ng 10.1: KiÓm tra tÖp vµ ý nghÜa cña chóng

KiÓm tra tÖp

ý nghÜa

-r TÖp hay danh môc ®äc ®îc-w TÖp hay danh môc ghi ®îc-x TÖp hay danh môc thùc hiÖn ®îc-o TÖp hay danh môc do ngêi dïng së h÷u-R TÖp hay danh môc ®äc ®îc bëi ngêi

dïng thùc, kh«ng ph¶i ngêi dïng hiÖu qu¶ (kh¸c -r víi ch¬ng tr×nh setuid)

-W TÖp hay danh môc ghi ®îc bëi ngêi dïng thùc, kh«ng ph¶i ngêi dïng hiÖu qu¶

Page 126: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

KiÓm tra tÖp

ý nghÜa

(kh¸c víi -w cho ch¬ng tr×nh setuid)-X TÖp hay danh môc thùc hiÖn ®îc bëi

ngêi dïng thùc, kh«ng ph¶i ngêi dïng hiÖu qu¶ (kh¸c víi -x cho ch¬ng tr×nh setuid)

-O TÖp hay danh môc ®îc së h÷u bëi ngêi dïng thùc, kh«ng ph¶i ngêi dïng hiÖu qu¶ (kh¸c víi -o cho ch¬ng tr×nh setuid)

-e TÖp hay danh môc ®· cã-z TÖp ®· cã vµ cã kÝch thíc kh«ng (danh

môc th× kh«ng bao giê rçng)-s TÖp hay danh môc ®· cã vµ cã kÝch thíc

kh¸c kh«ng (gi¸ trÞ ®îc tÝnh theo byte)-f Kho¶n môc lµ tÖp râ-d Kho¶n môc lµ danh môc-l Kho¶n môc lµ symlink-S Kho¶n môc lµ chç c¾m-p Kho¶n môc lµ ®êng èng cã tªn (mét

“fifo”)-b Kho¶n môc lµ tÖp khèi ®Æc biÖt (gièng

nh ®Üa th¸o l¾p ®îc)-c Kho¶n môc lµ tÖp kÝ tù ®Æc biÖt (nh

thiÕt bÞ vµo/ra)-u TÖp hay danh môc lµ setuid-g TÖp hay danh môc lµ setgid-k TÖp hay danh môc cã tËp bit dÝnh-t isatty() trªn tíc hiÖu tÖp lµ ®óng-T TÖp lµ v¨n b¶n-B TÖp lµ “nhÞ ph©n”-M söa tuæi theo ngµy-A Tuæi th©m nhËp theo ngµy-C Tuæi thay ®æi inode theo ngµy

PhÇn lín trong nh÷ng phÐp kiÓm tra nµy ®Òu cho l¹i mét ®iÒu kiÖn ®óng-sai ®¬n gi¶n. Sè Ýt th× kh«ng, cho nªn ta h·y nãi vÒ chóng.

To¸n tö -s kh«ng cho l¹i gi¸ trÞ ®óng nÕu tÖp lµ kh¸c rçng, nhng gi¸ trÞ cho l¹i lµ mét lo¹i ®óng ®Æc biÖt. §ã lµ chiÒu dµi theo byte cña tÖp, vÉn ®îc coi lµ ®óng ®èi víi mét sè kh¸c kh«ng.

To¸n tö tuæi -M, -A vµ -C (®óng, chóng ®Òu lµ ch÷ hoa c¶)

Page 127: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

cho l¹u sè ngµy kÓ tõ tÖp ®îc söa ®æi, th©m nhËp hay cã thay ®æi inode* lÇn cuèi. (inode chøa tÊt c¶ c¸c th«ng tin vÒ tÖp ngo¹i trõ néi dung cña nã - xem chi tiÕt trong lêi gäi hÖ thèng stat). Gi¸ trÞ tuæi nµy lµ ph©n sè víi ®é ph©n gi¶i mét gi©y - 36 giê ®îc cho l¹i lµ 1.5 ngµy. NÕu b¹n so s¸nh tuæi nµy víi toµn bé sè (ch¼ng h¹n ba), b¹n sÏ thu ®îc chØ c¸c tÖp ®· bÞ thay ®æi ®óng nhiÒu ngµy tríc ®©y, kh«ng nhiÒu hay Ýt h¬n mét gi©y. §iÒu nµy cã nghÜa lµ cã lÏ b¹n sÏ muèn cã viÖc so s¸nh theo ph¹m vi (hay to¸n tö int()) h¬n lµ so s¸nh chÝnh x¸c ®Ó ®-îc c¸c tÖp n»m gi÷a ba vµ bèn ngµy lÎ.

TÊt c¶ nh÷ng to¸n tö nµy cã thÓ vËn hµnh trªn tíc hiÖu tÖp còng nh tªn tÖp. Víi tíc hiÖu tÖp lµm to¸n h¹ng lµ tÊt c¶ nh÷ng g× to¸n tö ®ã cÇn. VËy ®Ó kiÓm tra xem liÖu tÖp cã ®îc më nh SOMEFILE cã lµ thùc hiÖn ®îc hay kh«ng, b¹n cã thÓ dïng:

if (-x SOMEFILE) {# më tÖp trªn SOMEFILE lµ thùc hiÖn ®îc

}NÕu b¹n ®Ó tham biÕn tªn tÖp hay tíc hiÖu tÖp bá kh«ng

(tøc lµ, b¹n chØ cã -r hay -s) th× to¸n h¹ng mÆc ®Þnh lµ tÖp cã tªn trong biÕn $_ (nã vÉn cã ®Êy!). Cho nªn, ®Ó kiÓm thö mét danh s¸ch c¸c tªn tÖp xem tÖp nµo ®äc ®îc, th× chØ cÇn ®¬n gi¶n lµ:

foreach (@some_list_of_filenames) {print “”$_ lµ ®äc ®îc\n” if -r; # còng nh -r $_

}C¸c to¸n tö stat() vµ lstat()

Trong khi c¸c phÐp kiÓm tra tÖp nµy lµ tèt cho viÖc kiÓm tra nhiÒu thuéc tÝnh liªn quan tíi mét tÖp hay danh môc ®Æc biÖt, th× chóng l¹i kh«ng nãi ®îc toµn bé c©u chuyÖn. Ch¼ng h¹n, kh«ng cã viÖc kiÓm tra tÖp nµo cho l¹i sè c¸c liªn kÕt víi mét tÖp. §Ó thu ®îc th«ng tin cßn l¹i vÒ tÖp, ®¬n thuÇn h·y gäi tíi to¸n tö stat(), to¸n tö cho l¹i ®ñ mäi thø mµ lêi gäi hµm hÖ thèng UNIX stat() cho (hi väng nhiÒu thø h¬n ®iÒu b¹n muèn biÕt).

To¸n h¹ng cña stat() lµ tíc hiÖu tÖp, hay mét biÓu thøc tÝnh cho tªn tÖp. Gi¸ trÞ cho l¹i hoÆc lµ undef, chØ ra r»ng stat kh«ng tsinh ®îc, hay mét m¶ng 13 gi¸ trÞ, phÇn lín ®Òu dÔ m« t¶ b»ng viÖc dïng danh s¸ch sau ®©y c¸c biÕn v« híng:

* Tuæi ®îc ®o t¬ng ®èi theo thêi gian ch¬ng tr×nh b¾t ®Çu, nh ®îc lÊy theo thêi gian UNIX trong biÕn S^T. Cã thÓ lÊy ®îc sè ©m cho nh÷ng tuæi nµy nÕu gi¸ trÞ hái tham kh¶o tíi mét sù kiÖn ®· xÈy ra sau khi ch¬ng tr×nh b¾t ®Çu.

Page 128: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev, $size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(...)C¸c tªn ë ®©y ®Òu trá tíi c¸c bé phËn cña cÊu tróc stat, ®îc

m« t¶ chi tiÕt trong stat(2) cña b¹n. Cã lÏ b¹n nªn nh×n vµo ®ã ®Ó xem c¸c m« t¶ chi tiÕt.

Ch¼ng h¹n ®Ó lÊy ID (sè hiÖu) ngêi dïng vµ ID nhãm cña tÖp mËt hiÖu, ta h·y thö:

($uid,$gid) = (stat (“/etc/passwd”)) [4, 5];Vµ ®ã lµ c¸ch lµm.Gäi to¸n tö stat() trªn tªn cña mét liªn kÕt kÝ hiÖu sÏ cho l¹i

th«ng tin vÒ liªn kÕt kÝ hiÖu nµy ®ang trá tíi c¸i g×, kh«ng ph¶i th«ng tin vÒ b¶n th©n liªn kÕt kÝ hiÖu (trõ phi liªn kÕt nµy xÈy ra ®Ó kh«ng trá vµo c¸i g× hiÖn thêi th©m nhËp ®îc). NÕu b¹n cÇn th«ng tin (phÇn lín v« dông) vÒ b¶n th©n liªn kÕt kÝ hiÖu, th× h·y dïng lstat() thay v× stat() (cho cïng th«ng tin theo cïng thø tù). To¸n tö lstat() lµm viÖc tùa nh stat() trªn nh÷ng ®iÒu kh«ng ph¶i lµ liªn kÕt kÝ hiÖu.

Gièng nh viÖc kiÓm t¶ tÖp, to¸n h¹ng cña stat hay lstat mÆc ®Þnh lµ $_, nghÜa lµ stat sÏ ®îc thùc hiÖn trªn tÖp cã tªn trong biÕn v« híng $_.Dïng _Filehandle

Mäi lÇn b¹n nãi stat(), -r, -w hay bÊt k× c¸i g× trong ch¬ng tr×nh, th× Perl ®Òu ph¶i trë ra hÖ thèng ®Ó hái bé ®Öm stat trªn tÖp (bé ®Öm cho l¹i tõ lêi gäi hÖ thèng stat). §iÒu ®ã cã nghÜa lµ nÕu b¹n muèn biÕt liÖu tÖp cã võa ®äc ®îc vµ ghi ®-îc kh«ng th× b¹n vÒ b¶n chÊt ®· hái hÖ thèng hai lÇn cho cïng mét th«ng tin (®iÒu nµy kh«ng thÓ thay ®æi ®îc trong mét m«i trêng kh¸ kh«ng th©n thiÖn)

§iÒu nµy cã vÎ nh l·ng phÝ, vµ trong thùc tÕ, cã thÓ tr¸nh ®-îc. Thùc hiÖn viÖc kiÓm tra tÖp, stat, hay lstat trªn _filehandle (mét dÊu g¹ch thÊp) xem nh to¸n h¹ng sÏ b¶o cho Perl dïng bÊt k× c¸i g× ngÉu nhiªn cã trong bé nhí tõ lÇn kiÓm tra tÖp tríc ®ã. §«i khi ®iÒu nµy lµ nguy hiÓm: mét ch¬ng tr×nh con cã thÓ gäi stat mét c¸ch kh«ng chñ ®Þnh, nÐm tiªu bé ®Öm cña b¹n ®i. Nhng nÕu b¹n cÈn thËn th× b¹n cã thÓ tiÕt kiÖm mét vµi lêi gäi hÖ thèng kh«ng cÇn thiÕt. Sau ®©y lµ thÝ dô n÷a vÒ viÖc kiÓm tra tÝnh ghi ®îc vµ ®äc ®îc $filevar, dïng mÑo míi:

if (-r $filevar && -w _) {print “$filevar lµ võa ®äc ®îc vµ ghi ®îc\n”;

Page 129: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

}Lu ý r»ng t«i ®· dïng $filevar cho phÐp kiÓm tra thø nhÊt -

®iÒu nµy lÊy d÷ liÖu tõ hÖ ®iÒu hµnh. LÇn kiÓm tra thø hai dïng _filehandle ¶o thuËt; víi phÐp kiÓm tra nµy, b¶n th©n d÷ liÖu bÞ bá l¹i tõ phÐp kiÓm tra $filevar vÒ tÝnh ®äc ®îc nay l¹i ®îc dïng, ®óng lµ ®iÒu ta mong muèn.

Chó ý r»ng viÖc kiÓm thö _filehandle kh«ng hÖt nh viÖc cho phÐp to¸n h¹ng cña viÖc kiÓm tra tÖp, stat, hay lstat ®îc mÆc ®Þnh kiÓm tra $_; ®iÒu nµy sÏ lµ viÖc kiÓm tra míi mçi lÇn trªn tÖp hiÖn t¹i mang tªn theo néi dung cña $_. §©y l¹i lµ mét trêng hîp kh¸c khi c¸c tªn t¬ng tù ®uîc chän cho c¸c chøc n¨ng kh¸ kh¸c nhau. HiÖn t¹i, b¹n cã lÏ ®· quen víi nã.

Bµi tËpXem phô lôc A vÒ lêi gi¶i.

1. H·y viÕt mét ch¬ng tr×nh ®Ó ®äc vµo mét tªn tÖp tõ STDIN, råi më tÖp ®ã vµ hiÓn thÞ néi dung cña nã cã ®øng tríc bëi tªn tÖp vµ mét dÊu hai chÊm. Ch¼ng h¹n, nÕu fred ®îc ®äc vµo, vµ tÖp fred bao gåm ba dßng aaa, bbb vµ ccc th× b¹n sÏ thÊy fred: aaa, fred: bbb vµ fred: ccc.

2. H·y viÕt mét ch¬ng tr×nh nh¾c ®a vµo mét tªn tÖp vµo, mét tªn tÖp ra, mét mÉu t×m kiÕm, vµ mét x©u thay thÕ, råi thay thÕ tÊt c¶ mäi lÇn xuÊt hiÖn cña mÉu t×m kiÕm b»ng x©u thay thÕ trong khi sao tÖp vµo sang tÖp ra. H·y thö nã trªn c¸c tÖp. B¹n cã thÓ ghi ®Ì mét tÖp hiÖn cã (®õng thö nã víi nh÷ng tÖp quan träng!) kh«ng? B¹n cã thÓ dïng c¸c kÝ tù biÓu thøc chÝnh qui trong x©u t×m kiÕm kh«ng? B¹n cã thÓ dïng \1 trong x©u thay thÕ kh«ng?

3. H·y viÕt mét ch¬ng tr×nh ®Ó ®äc vµo mét danh s¸ch c¸c tªn tÖp vµ råi cho hiÓn thÞ tõ ®ã c¸c tÖp nµo lµ ®äc ®îc, ghi ®îc, vµ/hoÆc thùc hiÖn ®îc, vµ tÖp nµo kh«ng tån t¹i. (B¹n cã thÓ thùc hiÖn tõng phÐp kiÓm thö cho tõng tªn tÖp khi b¹n ®äc chóng; hay trªn toµn bé tËp c¸c tªn khi b¹n ®· ®äc tÊt c¶ chóng. §õng quªn lo¹i bá dÊu dßng míi t¹i cuèi mçi tªn tÖp mµ b¹n ®· ®äc vµo.

4. H·y viÕt mét ch¬ng tr×nh ®Ó ®äc vµo mét danh s¸ch c¸c tªn tÖp, vµ t×m tÖp cò nhÊt trong chóng. h·y in ra tªn cña tÖp ®ã, tuæi cña nã theo sè ngµy.

Page 130: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

11

§Þnh d¹ng

§Þnh d¹ng lµ g×?Trong sè nhiÒu viÖc lµm ®îc, Perl thêng ®îc dïng lµm “ng«n

ng÷ trÝch rót vµ b¸o c¸o thùc hµnh.” §©y lµ lóc biÕt vÒ viÖc “ng«n ng÷ b¸o c¸o ®ã”.

Perl cung cÊp mét kh¸i niÖm vÒ tiªu b¶n viÕt b¸o c¸o ®¬n gi¶n, ®îc gäi lµ ®Þnh d¹ng. §Þnh d¹ng x¸c ®Þnh ra phÇn kh«ng ®æi (tiªu ®Ò cét, nh·n, v¨n b¶n cè ®Þnh hay bÊt k× c¸i g×) vµ phÇn biÕn ®æi (d÷ liÖu hiÖn t¹i mµ b¹n b¸o c¸o). H×nh d¹ng cña ®Þnh d¹ng th× rÊt gÇn víi h×nh d¹ng cña c¸i ra, t¬ng tù nh c¸i ra ®· ®îc ®Þnh d¹ng trong COBL hay mÖnh ®Ò print using cña mét sè ng«n ng÷ BASIC.

ViÖc dïng ®Þnh d¹ng bao gåm ba ®iÒu sau:1. §Þnh nghÜa ®Þnh d¹ng2. N¹p d÷ liÖu cÇn in vµo phÇn biÕn ®æi cña ®Þnh d¹ng (tr-

êng)3. gäi tíi ®Þnh d¹ngThêng th× bíc thø nhÊt ®îc thùc hiÖn ngay (trong v¨n b¶n

ch¬ng tr×nh sao cho nã ®îc x¸c ®Þnh vµo lóc dÞch), vµ hai bíc sau ®îc thùc hiÖn lÆp ®i lÆp l¹i.§Þnh nghÜa mét ®Þnh d¹ng

§Þnh d¹ng ®îc ®Þnh nghÜa b»ng viÖc dïng ®Þnh nghÜa ®Þnh d¹ng. §Þnh nghÜa ®Þnh d¹ng nµy cã thÓ xuÊt hiÖn ë bÊt k× ®©u trong v¨n b¶n ch¬ng tr×nh cña b¹n, gièng nh ch¬ng tr×nh con. §Þnh nghÜa ®Þnh d¹ng tr«ng tùa nh thÕ nµy:

format tªn®Þnhd¹ng =dßngtrêng gi¸_trÞ_mét, gi¸ _trÞ_hai, gi¸ _trÞ_badßngtrêng gi¸_trÞ_mét, gi¸ _trÞ_hai, gi¸ _trÞ_badßngtrêng gi¸_trÞ_mét, gi¸ _trÞ_hai, gi¸ _trÞ_ba

Trong ch¬ng nµy: §Þnh d¹ng lµ

g×? Gäi mét ®Þnh

d¹ng Nãi thªm vÒ

Fieldholder §Þnh d¹ng ®Çu

trang §æi mÆc ®Þnh

cho ®Þnh d¹ng

Page 131: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

.Dßng thø nhÊt cã chøa tõ dµnh riªng format, tiÕp ®ã lµ tªn

®Þnh d¹ng vµ råi ®Õn dÊu b»ng (=). Tªn ®Þnh d¹ng ®îc chän tõ mét kh«ng gian tªn kh¸c, vµ tu©n theo cïng qui t¾c nh mäi thø kh¸c. V× tªn ®Þnh d¹ng kh«ng bao giê ®îc dïng bªn trong th©n ch¬ng tr×nh (ngo¹i trõ bªn trong gi¸ trÞ x©u), nªn b¹n cã thÓ an toµn dïng c¸c tªn trïng víi víi c¸c tõ dµng riªng. Nh b¹n sÏ thÊy trong môc sau, “Gäi ®Þnh d¹ng,” phÇn lín c¸c tªn ®Þnh d¹ng cña b¹n cã lÏ sÏ lµ mét nh tªn tíc hiÖu tÖp (mµ thÕ th× lµm cho chóng kh«ng ph¶i lµ mét nh c¸c tõ dµnh riªng)

TiÕp theo sau dßng thø nhÊt lµ b¶n th©n tiªu b¶n, më réng tõ kh«ng ®Õn nhiÒu dßng v¨n b¶n. PhÇn cuèi cña tiªu b¶n ®îc chØ ra b»ng mét dÊu chÊm. Tiªu b¶n lµ nhËy c¶m víi kho¶ng tr¾ng - ®©y lµ mét trong vµi chç mµ mét sè kho¶ng tr¾ng (dÊu c¸ch, xuèng dßng, hay tab) g©y ra vÊn ®Ò trong v¨n b¶n ch¬ng tr×nh Perl.

§Þnh nghÜa tiªu b¶n cã chøa mét chuçi c¸c dßng trêng. Mçi dßng trêng cã thÓ chøa v¨n b¶n cè ®Þnh - v¨n b¶n sÏ ®îc in ra theo tõng kÝ tù khi ®Þnh d¹ng nµy ®îc gäi tíi. Sau ®©y lµ mét thÝ dô vÒ dßng trêng cã v¨n b¶n cè ®Þnh:

Hello, my name is Fred Flintstone.Tªn trêng cã thÓ chøa c¶ n¬i gi÷ trêng cho v¨n b¶n biÕn

®æi. NÕu mét dßng cã chøa n¬i gi÷ trêng, th× dßng tiÕp sau cña tiªu b¶n (®îc gäi lµ dßng gi¸ trÞ) sÏ m« t¶ cho mét lo¹t c¸c gi¸ trÞ v« híng - mçi gi¸ trÞ øng víi mét n¬i gi÷ trêng - mµ cung cÊp ra gi¸ trÞ sÏ ®îc g¾n vµo trong trêng. Sau ®©y lµ mét thÝ dô vÒ dßng trêng víi mét n¬i gi÷ trêng, vµ dßng gi¸ trÞ ®i theo:

Hello, my name is @<<<<<<<<<<<.$nameN¬i gi÷ trêng lµ @<<<<<<<<<<<, sÏ x¸c ®Þnh ra trêng

v¨n b¶n ®îc dån tr¸i bëi 11 kÝ tù. C¸c chi tiÕt ®Çy ®ñ h¬n vÒ n¬i gi÷ trêng sÏ ®îc nªu trong môc cã tªn “Nãi thªm vÒ n¬i gi÷ trêng” díi ®©y.

NÕu dßng trêng cã nhiÒu n¬i gi÷ trêng, th× nã cÇn nhiÒu gi¸ trÞ, cho nªn c¸c gi¸ trÞ ®îc t¸ch nhau bëi dÊu phÈy:

Hello, my name is @<<<<<<<<<<< and I’m @<< years old..

$name, $ageG¾n tÊt c¶ nh÷ng ®iÒu nµy l¹i chóng ta cã thÓ t¹o ra mét

®Þnh d¹ng ®¬n gi¶n cho mét nh·n ®Þa chØ:

Page 132: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

format ADDRESSLABEL =========================| @<<<<<<<<<<<<<<<<<<<< |$name| @<<<<<<<<<<<<<<<<<<<< |$address| @<<<<<<<<<<<, @< @<<<< |$city, $state, $zip========================.Lu ý r»ng c¸c dßng cã dÊu b»ng trªn ®Ønh vµ díi ®¸y cña

®Þnh d¹ng kh«ng cã trêng, vµ do vËy kh«ng cã dßng gi¸ trÞ theo sau. (NÕu b¹n ®Æt mét dßng gi¸ trÞ ®i theo sau dßng tr-êng nhu vËy, nã sÏ ®îc diÔn gi¶i nh mét dßng trêng kh¸c, cã thÓ kh«ng lµm ®iÒu b¹n muèn.)

Kho¶ng tr¾ng bªn trong dßng gi¸ trÞ bÞ bá qua. Mét sè ngêi chän viÖc dïng kho¶ng trèng phô trong dßng gi¸ trÞ ®Ó nèi dßng biÕn víi n¬i gi÷ trêng trªn dßng tríc ®ã (nh ®Æt $zip ë díi trêng thø ba cña dßng tríc ®ã trong thÝ dô nµy), nhng thÕ chØ ®Ó mµ tr«ng th«i. Perl kh«ng quan t©m tíi ®iÒu ®ã, vµ nã kh«ng ¶nh hëng tíi c¸i ra cña b¹n.

C¸c gi¸ trÞ ®îc tÝnh to¸n cho c¸c gi¸ trÞ v« híng cña chóng, cho nªn tÊt c¶ c¸c biÓu thøc ®Òu ®îc diÔn gi¶i theo ng÷ c¶nh v« híng* . V¨n b¶n theo sau dÊu xuèng dßng thø nhÊt trong mét gi¸ trÞ bÞ bá qua (ngo¹i trõ trong trêng hîp ®Æc biÖt nhiÒu n¬i gi÷ trêng, sÏ ®îc m« t¶ vÒ sau).

§Þnh nghÜa ®Þnh d¹ng còng gièng nh ®Þnh nghÜa ch¬ng tr×nh con. Nã kh«ng chøa ch¬ng tr×nh thùc hiÖn ngay lËp tøc, vµ do ®ã cã thÓ ®îc ®Æt ë bÊt k× ®©u trong tÖp víi phÇn cßn l¹i cña ch¬ng tr×nh - t«i cã khuynh híng ®Æt nh÷ng ®Þnh d¹ng cña m×nh vµo cuèi tÖp, tríc c¸c ®Þnh nghÜa ch¬ng tr×nh con.Gäi mét ®Þnh d¹ng

B¹n gäi tíi mét ®Þnh d¹ng b»ng to¸n tö write. To¸n tö nµy lÊy tªn cña tíc hiÖu tÖp, vµ sinh ra v¨n b¶n cho tíc hiÖu tÖp ®ã b»ng viÖc dïng ®Þnh d¹ng hiÖn thêi cho tíc hiÖu tÖp ®ã. Theo ngÇm ®Þnh, ®Þnh d¹ng hiÖn thêi cho mét tíc hiÖu tÖp lµ ®Þnh d¹ng víi cïng tªn (cho nªn víi tíc hiÖu tÖp STDOUT, ®Þnh d¹ng STDOUT sÏ ®îc dïng), nhng chóng ta sÏ thÊy ngay r»ng b¹n cã * Trong Perl 5.0, t«i ®îc biÕt r»ng toµn bé dßng b©y giê ®îc tÝnh theo ng÷ c¶nh m¶ng, cho nªn ph¸t biÓu nµy lµ kh«ng ®óng. §¸ng ph¶i nãi kh¸c ®i nªu b¹n cã ®iÒu g× ®ã nh @a lµ mét gi¸ trÞ.

Page 133: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

thÓ thay ®æi nã.Ta h·y lÊy mét thÝ dô kh¸c b»ng viÖc xÐt ®Þnh d¹ng nh·n

®Þa chØ, vµ t¹o ra mét tÖp chøa c¸c n·hn ®Þa chØ. Sau ®©y lµ mét ®o¹n ch¬ng tr×nh:

format ADDRESSLABEL =========================| @<<<<<<<<<<<<<<<<<<<< |$name| @<<<<<<<<<<<<<<<<<<<< |$address| @<<<<<<<<<<<, @< @<<<< |$city, $state, $zip========================.open (ADDRESSLABEL, “>labels-to-print”) || die “can’t

create”;open (ADDRESSLABEL, “addresses”) || die “can not open

addresses”;while ( <ADDRESSES> ) {

chop; # remove newline($name, $address, $city, $state, $zip) = split (/:/) ;

# load up the global variableswrite ADDRESSLABEL; # send the output

}T¹i ®©y chóng ta thÊy ®Þnh nghÜa ®Þnh d¹ng tríc, nhng

b©y giê chóng ta còng cßn cã thªm c¶ ch¬ng tr×nh thùc hiÖn n÷a. Tríc hÕt, chóng ta më mét tíc hiÖu tÖp lªn mét tÖp ra ®îc gäi lµ labels-to-print. Lu ý r»ng tªn tíc hiÖu tÖp (ADDRESSLABEL) lµ cïng tªn cña ®Þnh d¹ng. §iÒu nµy lµ quan träng. TiÕp ®ã, ta më tíc hiÖu tÖp trªn danh s¸ch ®Þa chØ. §Þnh d¹ng cña danh s¸ch ®Þa chØ ®îc gi¶ sö lµ mét c¸i g× ®ã tùa nh:

Stonehenge:4470 SW Hall Suite 107: Beaverton:OR:97005Fred Flintstone:3737 Hard Rock Lane:Bedrock:OZ:999bcNãi c¸ch kh¸c, n¨m trêng t¸ch biÖt, mµ ch¬ng tr×n hcña ta

sÏ ph©n tÝch nh m« t¶ díi ®©y.Chu tr×nh while trong ch¬ng tr×nh nµy ®äc tõng dßng cña

tÖp ®Þa chØ mçi lóc, bá ®i dÊu xuèng dßng, råi chÎ dßng nµy (kh«ng cã dÊu xuèng dßng) vµo n¨m biÕn. Lu ý r»ng c¸c tªn biÕn còng lµ tªn mµ ta ®· dïng khi ®Þnh nghÜa ®Þnh d¹ng. §iÒu nµy n÷a còng lµ quan träng.

Page 134: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Mét khi ta cã tÊt c¶ c¸c biÕn ®îc n¹p vµo (®Ó cho c¸c gi¸ trÞ ®îc ®Þnh d¹ng sö dông lµ ®óng ®¾n), th× to¸n tö write gäi tíi ®Þnh d¹ng nµy. L ý r»ng tham biÕn cho write lµ tíc hiÖu tÖp cÇn ghi ra vµ theo mÆc ®Þnh ®Þnh d¹ng cho cïng tªn còng ®îc dïng.

Mçi trêng trong ®Þnh d¹ng ®Òu ®îc thay thÕ bëi mét gi¸ trÞ t¬ng øng tõ dßng tiÕp cña ®Þnh d¹ng. Sau khi hai b¶n ghi mÉu ®îc nªu ë trªn ®· ®îc xö lÝ, th× tÖp labels-to-print cã chøa:

=====================| Stonehege || 4470 SW Hall Suite 107 || Beaverton , OR 97005|==========================================| Fred Flintstone || 3737 Hard Rock Lane || Bedrock , OZ 999bc |=====================

Nãi thªm vÒ n¬i gi÷ tÖpCho ®Õn giê, qua thÝ dô, b¹n ®· biÕt r»ng n¬i gi÷ trêng

@<<<< cã nghÜa lµ mét trêng ®îc dån tr¸i víi n¨m kÝ tù vµ r»ng @<<<<<<<<<<< nghÜa lµ mét trêng ®îc dån tr¸i víi 11 kÝ tù. Sau ®©y lµ toµn bé ph¹m vi, nh ®· høa tríc ®©y.

Trêng v¨n b¶nPhÇn lín nh÷ng n¬i gi÷ trêng ®Òu b¾t ®Çu b»ng @. C¸c kÝ

tù ®i sau @ chØ ra kiÓu cña trêng, trong khi sè c¸c kÝ tù (kÓ c¶ @) chØ ra chiÒu réng cña trêng.

NÕu c¸c kÝ tù ®i sau @ lµ dÊu më ngoÆc gãc tr¸i (<<<<) th× b¹n nhËn ®îc mét trêng ®îc dån tr¸i - tøc lµ, gi¸ trÞ sÏ ®îc g¾n thªm bªn ph¶i b»ng dÊu c¸ch nÕu gi¸ trÞ nµy ng¾n h¬n chiÒu réng trêng. (NÕu mét gi¸ trÞ qu¸ dµi th× nã sÏ bÞ chÆt côt tù ®éng - d¹ng cña ®Þnh d¹ng bao giê còng ®îc b¶o tån.)

NÕu c¸c kÝ tù ®i sau @ lµ dÊu ®ãng ngoÆc gãc ph¶i (>>>>) th× b¹n nhËn ®îc mét trêng ®îc dån ph¶i - tøc lµ nÕu gi¸ trÞ qu¸ ng¾n, th× nã sÏ ®îc bæ sung dÊu c¸ch vµo bªn tr¸i.

Cuèi cïng, nÕu c¸c kÝ tù ®i sau @ lµ dÊu sæ ®øng (| | | |) th× b¹n nhËn ®îc mét trêng ®Þnh t©m: nÕu gi¸ trÞ qu¸ ng¾n th× nã ®îc bæ sung thªm dÊu c¸ch vµo c¶ hai bªn, ®ñ cho tõng

Page 135: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

bªn lµm cho gi¸ trÞ thµnh ®Þnh t©m nhÊt bªn trong trêng.Trêng sè

Mét lo¹i n¬i gi÷ trêng kh¸c lµ trêng sè ®é chÝnh x¸c tÜnh, cã Ých cho nh÷ng b¸o c¸o tµi chÝnh lín. Trêng nµy còng b¾t ®Çu víi @, vµ ®îc theo sau bëi mét hay nhiÒu dÊu # víi mét dÊu chÊm tuú chän (chØ ra dÊu chÊm thËp ph©n). Mét lÇn n÷a, @ l¹i ®îc ®Õm nh mét trong c¸c kÝ tù cña trêng. Ch¼ng h¹n:

format MONEYAssets: @#####.## Liabilities: @#####.## Net:

@#####.##$assets, $liabilities, $assets-$liabilities.Ba trêng sè cho phÐp s¸u vÞ trÝ bªn tr¸i dÊu chÊm thËp

ph©n vµ hai vÞ trÝ bªn ph¶i (cã Ých cho ®« la MÜ vµ phÇn xu). B¹n h·y lu ý tíi viÖc dïng mét biÓu thøc theo ®Þnh d¹ng - hoµn toµn hîp lÖ vµ thêng hay ®îc dïng.

Perl kh«ng ®a ra ®iÒu g× cho ngêi thµnh th¹o kh¸c h¬n ®iÒu nµy: b¹n kh«ng thÓ nµo lÊy kÝ hiÖu tiÒn tr«i næi hay dÊu ngoÆc nhän quanh gi¸ trÞ ©m hay bÊt k× c¸i g× kh¸c. §Ó lµm ®iÒu ®ã, b¹n ph¶i viÕt ch¬ng tr×nh con cña riªng m×nh, kiÓu nh:

format MONEYCOOL = Assets: @#####.## Liabilities: @#####.## Net:

@#####.##&cool ($assets, 10), &cool ($liabilities, 9) , &cool ($assets-

$liabilities, 10).sub cool {

local ($n, $width) = @_ ;$width -= 2 ; # back off for negative stuff$n = sprintf (“%.2f”, $n) ; # sprintf is in later chapterif ($n < 0) {

sprintf (“[%$width.2f]”, - $n) ;# negative numbers get spaces instead

}}## body of program:$assets = 32125.12; $liab = 45212.15; write MONEYCOOL;

Page 136: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Trêng nhiÒu dßngNh ®· nãi tríc ®©y, Perl th«ng thêng dõng t¹i dÊu xuèng

dßng ®Çu tiªn cña mét gi¸ trÞ khi ®Æt kÕt qu¶ vµo ®Çu ra. Mét lo¹i n¬i chøa trêng, n¬i chøa trêng nhiÒu dßng, cho phÐp b¹n ®a vµo mét gi¸ trÞ mµ cã thÓ cã nhiÒu dßng th«ng tin. N¬i chøa trêng nµy ®îc kÝ hiÖu bëi @* trªn mét dßng bëi chÝnh nã - bao giê còng vËy, dßng ®i theo sau x¸c ®Þnh ra gi¸ trÞ mµ sÏ ®îc thÕ vµo trong trêng nµy, mµ trong trêng hîp nµy cã thÓ lµ mét biÓu thøc cho kÕt qu¶ cã chøa trªn nhiÒu dßng.

Gi¸ trÞ ®îc thÕ vµo sÏ tr«ng hÖt nh v¨n b¶n gèc: bèn dßng cña gi¸ trÞ trë thµnh bèn dßng cña c¸i ra. Ch¼ng h¹n:

format STDOUT =Text Before.@*$long_stringText After..$long_string = “Fred\nBaney\nBetty\nWilma\n”;write ;sinh ra c¸i ra:Text Before.FredBaneyBettyWilmaText After.

Trêng ®îc lÊp ®ÇyM«tt lo¹i n¬i chøa trêng kh¸c lµ trêng ®îc lÊp ®Çy. N¬i chøa

trêng nµy cho phÐp b¹n t¹o ra mét ®o¹n ®îc lÊp ®Çy, bÎ v¨n b¶n thµnh c¸c dßng cã kÝch cì qui íc t¹i biªn giíi tõ, bao bäc dßng nÕu cÇn. Cã vµi phÇn cïng lµm viÖc ë ®©y, nhng chóng ta h·y xÐt chóng mét c¸ch t¸ch biÖt.

Tríc hÕt, mét trêng ®îc lÊp ®Çy ®îc kÝ hiÖu b»ng viÖc thay thÕ dÊu hiÖu @ trong n¬i chøa trêng v¨n b¶n bëi dÊu mò (vËy b¹n nhËn ®îc ^<<<<, ch¼ng h¹n). Gi¸ trÞ t¬ng øng cho trêng ®îc lÊp ®Çy (trªn dßng tiÕp cña ®Þnh d¹ng) ph¶i lµ mét biÕn v« híng cã chøa v¨n b¶n, thay v× mét biÓu thøc cho l¹i mét gi¸ trÞ v« híng. LÝ do cho ®iÒu nµy lµ ë chç Perl sÏ thay ®æi biÕn nµy trong khi rãt ®Çy trêng ®îc lÊp, vµ còng h¬i khã ®Ó mµ thay ®æi mét biÓu thøc.

Page 137: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Khi Perl rãt ®Çy trêng ®îc lÊp th× nã lÊy gi¸ trÞ cña biÕn vµ v¬ lÊy nhiÒu tõ (b»ng viÖc dïng mét ®Þnh nghÜa hîp lÝ vÒ “tõ”)* ®ñ khÝt vµo trong trêng. Nh÷ng tõ nµy thùc tÕ vît ra ngoµi biÕn - gi¸ trÞ cña biÕn nµy sau khi rãt ®Çy trêng nµy lµ bÊt k× c¸i g× bÞ bá l¹i sau khi lo¹i bá tõ. B¹n sÏ thÊy t¹i sao ngay sau ®©y.

Cho ®Õn ®©y, ®iÒu nµy dêng nh kh«ng kh¸c nhiÒu l¾m víi c¸ch thøc trêng v¨n b¶n lµm viÖc - chóng ta chØ in ra võa ®ñ trêng (ngo¹i trõ r»ng chóng ta vÉn t«n träng biªn giíi tõ thay v× c¾t bá nã theo chiÒu réng tõ). C¸i ®Ñp cña trêng ®îc rãt nµy xuÊt hiÖn khi b¹n cã nhiÒu tham kh¶o tíi cïng biÕn theo cïng ®Þnh d¹ng. Ta h·y nh×n vµo ®iÒu nµy:format PEOPLE =Name: @<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<$name, $comment Comment: ^<<<<<<<<<<<<<<<<<< $comment Comment: ^<<<<<<<<<<<<<<<<<< $comment Comment: ^<<<<<<<<<<<<<<<<<< $comment.

Lu ý r»ng biÕn $comment xuÊt hiÖn bèn lÇn. Dßng thø nhÊt (dßng víi trêng tªn) in ra tªn ngêi vµ vµi tõ ®Çu cña gi¸ trÞ trong $comment. Nhng trong tiÕn tr×nh tÝnh dßng nµy, $comment bÞ thay ®æi ®Ó cho c¸c tõ biÕn mÊt. Dßng thø hai l¹i tham kh¶o ®Õn cïng biÕn nµy ($comment), vµ do vËy sÏ lÊy ®i vµi tõ míi n÷a tõ cïng biÕn nµy. §iÒu nµy còng ®óng cho dßng thø ba vµ thø t. Mét c¸ch cã hiÖu qu¶, ®iÒu t«i ®· t¹o ra lµ mét h×nh ch÷ nhËt trong c¸i ra mµ sÏ ®îc rãt ®Çy víi c¸c tõ trong $comment tr¶i qua bèn dßng.

§iÒu g× x¶y nÕu toµn bé v¨n b¶n chiÕm Ýt h¬n bèn dßng? §îc, b¹n sÏ ®îc mét hay hai dßng trèng. §iÒu nµy cã lÏ lµ ®îc nÕu b¹n ®Þnh in ra c¸c nh·n vµ cÇn ®óng cïng sè dßng cho mçi môc s¸nh ®óng víi nh·n ®ã. Nhng nÕu b¹n ®Þnh in ra mét b¸o c¸o, th× nhiÒu dßng trèng sÏ lµm tèn giÊy m¸y in cña b¹n.

§Ó gi¶i quyÕt vÊn ®Ò nµy, chóng ta cã thÓ dïng mét chØ * KÝ tù t¸ch tõ ®îc ®Þnh nghÜa bëi $:biÕn

Page 138: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

b¸o c¾t bá. BÊt k× dßng nµo cã chøa dÊu ng· (~) ®Òu bÞ c¾t bá (kh«ng in ra) nÕu dßng chØ cã dÊu c¸ch. B¶n th©n dÊu ng· bao giê còng in ra nh dÊu trèng, vµ cã thÓ ®îc ®Æt ë bÊt k× ®©u mµ dÊu c¸ch cã thÓ ®îc ®Æt trong dßng. ViÕt l¹i thÝ dô võa råi:format PEOPLE =Name: @<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<$name, $comment~ Comment: ^<<<<<<<<<<<<<<<<<< $comment~ Comment: ^<<<<<<<<<<<<<<<<<< $comment~ Comment: ^<<<<<<<<<<<<<<<<<< $comment.

B©y giê, nÕu lêi b×nh luËn chØ chiÕm hai dßng, th× c¸c dßng thø ba vµ thø t tù ®éng bÞ c¾t bá.

§iÒu g× x¶y ra nÕu lêi b×nh luËn l¹i dµi h¬n bèn dßng? §îc, chóng ta cã thÓ t¹o 20 b¶n sao cho hai dßng cuèi cña ®Þnh d¹ng ®ã, hi väng r»ng 20 dßng sÏ ®ñ cho nã. Nhng ®iÒu ®ã l¹i ®i ngîc víi ý tëng r»ng Perl gióp b¹n lêi biÕng, cho nªn cã mét c¸ch lêi biÕng ®Ó thùc hiÖn ®iÒu ®ã. BÊt k× dßng nµocã chøa hai dÊu ng· liªn tiÕp ®Òu sÏ ®îc lÆp l¹i mét c¸ch tù ®éng cho tíi khi kÕt qu¶ lµ mét dßng trèng hoµn toµn. (Dßng trèng bÞ c¾t bá.) §iÒu nµy lµm thay ®æi ®Þnh d¹ng cña chóng ta tr«ng gièng thÕ nµy:format PEOPLE =Name: @<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<$name, $comment~~ Comment: ^<<<<<<<<<<<<<<<<<< $comment.

C¸ch nµy, nÕu lêi b×nh luËn chiÕm mét, hai hay 20 dßng th× chóng ta vÉn gi¶i quyÕt æn tho¶.

Lu ý r»ng tiªu chuÈn ®Ó chÊm døt dßng lÆp l¹i ®ßi hái dßng ph¶i trèng t¹i ®iÓm nµo ®ã. §iÒu ®ã nghÜa lµ b¹n cã lÏ kh«ng

Page 139: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

muèn bÊt k× v¨n b¶n h»ng nµo (kh¸c h¬n dÊu trèng hay dÊu ng·) trªn dßng nµy, hay nÕu kh«ng nã sÏ ch¼ng bao giê trë thµnh trèng. (Cã ®Êy, Perl sÏ lÆp m·i trong trêng hîp nµy. §iÒu nµy nghe ®ån ®· ®îc gi¶i quyÕt trong Perl 5.0)§Þnh d¹ng ®Çu trang

NhiÒu b¸o c¸o kÕt thóc trªn mét thiÕt bÞ in ra m¸y in nµo ®ã. GiÊy m¸y in th«ng thêng ®îc c¾t ra thµnh chïm c¸c trang, bëi v× phÇn lín chóng ta ®· ngõng ®äc giÊy trong cuén tõ l©u råi. Cho nªn v¨n b¶n ®îc n¹p vµo m¸y in vÒ c¬ b¶n ph¶i tÝnh tíi biªn giíi trang ®Ó ®a vµo c¸c dßng trèng hay kÝ tù kÐo trang ®Ó nhÈy qua chç d. B©y giê b¹n cã thÓ lÊy mét c¸i ra cña ch-¬ng tr×nh Perl vµ n¹p nã vµo mét tr×nh tiÖn Ých nµo ®ã (cã thÓ thËm chÝ lµ ®îc viÕt trong Perl) mµ lµm viÖc ph©n trang nµy, nhng vÉn cßn c¸ch dÔ h¬n.

Perl cho phÐp b¹n x¸c ®Þnh ®Þnh d¹ng ®Çu trang ®Ó cµi bÉy xö lÝ trang. Perl ®Õm tõng dßng ®îc sinh ra vµ gäi tíi ®Þnh d¹ng cho mét tíc hiÖu tÖp ®Æc biÖt. Khi ®Þnh d¹ng c¸i ra tiÕp kh«ng cßn khÝt vµo phÇn cßn l¹i cña trang, th× Perl phun ra mét dÊu kÐo trang tiÕp sau ®ã tù ®éng gäi tíi ®Þnh d¹ng ®Çu trang, vµ cuèi cïng lµ in ra v¨n b¶n theo ®Þnh d¹ng ®· gäi. Theo c¸ch ®ã, kÕt qu¶ cña mét lÇn gäi write sÏ kh«ng bao giê c¾t ngang qua biªn giíi trang (tÊt nhiªn trõ phinã qu¸ lín mµ kh«ng thÓ khÝt trªn chÝnh b¶n th©n trang).

§Þnh d¹ng ®Çu trang ®îc x¸c ®Þnh gièng nh c¸c ®Þnh d¹ng kh¸c. Tªn mÆc ®Þnh cho ®Þnh d¹ng ®Çu trang ®èi víi mét tíc hiÖu tÖp ®Æc biÖt lµ gièng nh tªn cña tíc hiÖu tÖp cã theo sau bëi _TOP (xin h·y viÕt ch÷ hoa).

Perl ®Þnh nghÜa biÕn $% lµ sè dßng cña ®Þnh d¹ng ®Çu trang mµ ®· ®îc gäi cho mét tíc hiÖu tÖp ®Æc biÖt, cho nªn b¹n cã thÓ dïng biÕn nµy trong ®Þnh d¹ng ®Çu trang cña m×nh ®Ó ®¸nh sè trang cho ®óng. Ch¼ng h¹n, viÖc thªm ®inh nghÜa ®Þnh d¹ng sau cho ®o¹n ch¬ng tr×nh tríc ng¨n c¶n c¸c nh·n kh«ng bÞ xÐ lÎ qua biªn giíi trang, vµ còng ®¸nh sè trang liªn tôc:

format ADDRESSLABEL_TOP = My Address -- Page @< $%.ChiÒu dµi trang mÆc ®Þnh lµ 60 dßng. B¹n cã thÓ thay ®æi

®iÒu nµy b»ng viÖc ®Æt mét biÕn ®Æc biÖt, ®îc m« t¶ tãm t¾t.

Page 140: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Perl kh«ng ®Ó ý liÖu b¹n cã dïng print ®Ó in lªn cïng tíc hiÖu tÖp hay kh«ng cho nªn nã cã thÓ nÐm ®i sè dßng trªn trang. B¹n cã thÓ hoÆc lµ viÕt l¹i ch¬ng tr×nh cña m×nh ®Ó dïng c¸c ®Þnh d¹ng ®Ó göi ®i mäi thø, hay tr¸nh nÐ biÕn “sè dßng trªn trang hiÖn t¹i” sau khi b¹n thùc hiÖn lÖnh print. Chót n÷a chóng ta sÏ thÊy c¸ch thay ®æi gi¸ trÞ nµy.Thay ®æi mÆc ®Þnh cho ®Þnh d¹ng

T«i thêng nãi tíi “mÆc ®Þnh” cho ®iÒu nµy ®iÒu nä. §îc, Perl cung cÊp mét c¸ch ®Ó vît qua c¸c mÆc ®Þnh cho mäi bíc. Ta h·y nãi vÒ ®iÒu nµy.Dïng select() ®Ó thay ®æi tíc hiÖu tÖp

Quay trë l¹i khi ta nãi vÒ print, trong ch¬ng 6, C¬ së vÒ vµo/ra, t«i ®· nãi r»ng print vµ print STDOUT lµ ®ång nhÊt, bëi v× STDOUT lµ mÆc ®Þnh cho print. Kh«ng h¼n hoµn toµn thÕ. MÆc ®Þnh thùc cho print (vµ write cïng mét vµi phÐp to¸n kh¸c mµ ta sÏ gÆp ngay sau ®©y) lµ mét kh¸i niÖm k× côc ®îc gäi lµ tíc hiÖu tÖp hiÖn ®ang ®îc lùa.

Tíc hiÖu tÖp hiÖn ®ang ®îc lùa viÕt t¾t lµ STDOUT - ®Ó lµm cho nã dÔ in mäi thø trªn ®Çu ra chuÈn. Tuy nhiªn, b¹n cã thÓ thay thÕ tíc hiÖu tÖp hiÖn ®ang ®îc lùa b»ng to¸n tö select(). To¸n tö nµy nhËn mét tíc hiÖu tÖp (hay biÕn v« híng cã chøa tªn cña tíc hiÖu tÖp) nh mét ®èi. Mét khi tíc hiÖu tÖp hiÖn ®îc lùa mµ thay ®æi, th× nã ¶nh hëng tíi tÊt c¶ c¸c phÐp to¸n t¬ng lai mµ phô thuéc vµo tíc hiÖu tÖp hiÖn ®îc lùa. Ch¼ng h¹n:

print “hello world\n”; # gièng nh print STDOUT “hello world\n”;

select(LOGFILE) ; # chän mét tíc hiÖu tÖp míiprint “howdy, world\n”; gièng nh print LOGFILE “howdy

world\n”;print “more for the log\n”; # thªm vÒ LOGFILEselect (STDOUT); # chän l¹i STDOUTprint “back to stdout\n”; # l¹i trë vÒ víi ®Çu ra chuÈnLu ý r»ng phÐp to¸n select lµ khã tÝnh - mét khi b¹n ®· lùa

mét tíc hiÖu míi th× nã vÉn cßn cã hiÖu qu¶ cho tíi select tiÕp.Cho nªn, mét ®Þnh nghÜa tèt h¬n cho STDOUT vÉn t«n

träng print vµ write lµ ë chç STDOUT lµ tíc hiÖu hiÖn ®îc lùa mÆc ®Þnh, hay tíc hiÖu “mÆc ®Þnh mÆc ®Þnh”

C¸c ch¬ng tr×nh con cã thÓ thÊy nhu cÇu thay ®æi tíc hiÖu

Page 141: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

tÖp hiÖn ®îc lùa. Tuy nhiªn, sÏ bÊt ngê nÕu b¹n gäi mét ch¬ng tr×nh con råi ph¸t hiÖn ra lµ tÊt c¶ c¸c dßng v¨n b¶n b¹n ®· so¹n c«ng phu l¹i dßn thµnh mét bã c¸c bit nµo ®ã bëi v× ch-¬ng tr×nh con ®· thay ®æi tíc hiÖu tÖp hiÖn ®îc lùa mµ kh«ng kh«i phôc l¹i nã. Cho nªn mét ch¬g tr×nh con hµnh xö tèt cÇn ph¶i lµm g×? NÕu ch¬ng tr×nh con nµy biÕt r»ng tíc hiÖu hiÖn thêi lµ STDOUT th× ch¬ng tr×nh con ®ã cã thÓ kh«i phôc tíc hiÖu ®· lùa víi ch¬ng tr×nh t¬ng tù nh trªn. Tuy nhiªn, ®iÒu g× xÈy ra nÕu n¬i gäi ch¬ng tr×nh con nµy ®· thay ®æi tíc hiÖu tÖp ®· lùa?

VËy vÊn ®Ò trë thµnh gi¸ trÞ cho l¹i tõ select lµ mét x©u cã chøa tªn cña tíc hiÖu ®· lùa tríc ®ã. B¹n cã thÓ n¾m lÊy gi¸ trÞ nµy ®Ó kh«i phôc tíc hiÖu tÖp ®· lùa tríc ®ã, b»ng viÖc dïng ®o¹n ch¬ng tr×nh nh thÕ nµy:

$oldhandle = select(LOGFILE) ;print “this goes to LOGFILE\n”;select($oldhandle); # kh«i phôc tíc hiÖu tríc ®ã§Êy, ®Ó lµm thÝ dô, thÕ th× dÔ dµng h¬n nhiÒu lµ chØ cÇn

®Æt LOGFILE mét c¸ch têng minh nh mét tíc hiÖu tÖp cho print, nhng cã mét sè thao t¸c ®ßi hái tíc hiÖu tÖp hiÖn ®îc lùa ph¶i thay ®æi, nh ta sÏ thÊy ngay sau ®©y.Thay ®æi tªn ®Þnh d¹ng

Tªn ®Þnh d¹ng ngÇm ®Þnh cho mét tíc hiÖu tÖp lµ gièng nh tíc hiÖu tÖp. Tuy nhiªn, b¹n cã thÓ cthay ®æi ®iÒu nµy cho tíc hiÖu tÖp hiÖn ®îc lùa b»ng viÖc thiÕt ®Æt tªn ®Þnh d¹ng míi trong mét biÕn ®Æc biÖt ®îc gäi lµ $~. B¹n cã thÓ còng xem xÐt l¹i gi¸ trÞ cña biÕn nµy ®Ó xem ®Þnh d¹ng hiÖn thêi lµ g× ®èi víi tíc hiÖu tÖp hiÖn ®îc lùa.

Ch¼ng h¹n, ®Ó dïng

Page 142: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

12

Th©m nhËp danh môc

ChuyÓn vßng quanh c©y danh môc

Page 143: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

13

Thao t¸c tÖp vµ danh môc

Lo¹i bá tÖp

Page 144: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

14

Qu¶n lÝ tiÕn tr×nh

Dïng system() vµ exec()

Page 145: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

15

BiÕn ®æi d÷ liÖu kh¸c

T×m mét x©u conT×m mét x©u con phô thuéc vµo n¬i b¹n mÊt nã. NÕu b¹n

ngÉu nhiªn mÊt nã bªn trong mét x©u lín h¬n, th× b¹n cßn may m¾n, v× index() cã thÓ gióp b¹n t×m ra. Sau ®©y lµ d¸ng vÎ cña nã:

$x = index ($string, $substring) ;Perl ®Þnh vÞ lÇn xuÊt hiÖn ®Çu tiªn cña substring bªn trong

string, cho l¹i mét sè nguyªn chØ vÞ trÝ cña kÝ tù ®Çu tiªn. Gi¸ trÞ chØ sè nµy ®îc cho l¹i dùa trªn kh«ng - tøc lµ nÕu t×m ®îc substring ë chç b¾t ®Çu cña string, th× b¹n nhËn ®îc 0. NÕu nã lµ ë mét kÝ tù sau ®ã th× b¹n nhËn ®îc 1, vµ cø nh thÕ. NÕu kh«ng t×m thÊy substring trong string, th× b¹n nhËn ®îc -1.

Ta h·y xem nh÷ng ®iÒu sau:$where = index(“hello”, “e”); # $where nhËn 1$oerson = “barney”;$where = index(“fred barney”, $person) ; # $where nhËn 5@rockers = (“fred”, “barney”) ;$where = index(join(“ “, @rockers), $person); # còng thÕChó ý r»ng c¶ hai x©u nµy ®Òu ®îc t×m kiÕm vµ x©u ®îc

t×m kiÕm th× cã thÓ lµ mét h»ng x©u kÝ hiÖu, mét biÕn v« h-íng cã chøa mét x©u, hay thËm chÝ mét biÓu thøc cã gi¸ trÞ x©u v« híng. Sau ®©y lµ mét sè thÝ dô n÷a:

$which = index(“a very long string”, “long”); # $switch nhËn 7

$which = index(“a very long string”, “lame”); # $switch nhËn -1

NÕu x©u cã chøa x©u con t¹i nhiÒu vÞ trÝ th× to¸n tö index() sÏ cho l¹i vÞ trÝ bªn tr¸i nhÊt. §Ó t×m ra c¸c vÞ trÝ sau, b¹n cã thÓ cho index() tham biÕn thø ba. Tham biÕn nµy lµ gi¸ trÞ tèi thiÓu mµ index() sÏ cho l¹i, cho phÐp b¹n t×m lÇn xuÊt hiÖn tiÕp cña x©u con theo sau mét vÞ trÝ ®· chän. Nã tr«ng tùa nh thÕ nµy:

$x = index($bigtring, $littlestring, $skip);

Page 146: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Sau ®©y lµ mét sè thÝ dô vÒ c¸ch tham biÕn thø ba lµm viÖc:

$where = index(“hello world”, “l”); # cho l¹i 2 (l ®Çu tiªn)$where = index(“hello world”, “l”, 0); # còng thÕ$where = index(“hello world”, “l”, 1); # vÉn thÕ$where = index(“hello world”, “l”,3); # b©y giê cho l¹i 3# (3 lµ vÞ trÝ ®Çu tiªn lín h¬n hay b»ng 3)$where = index(“hello world”, “o”, 5); # cho l¹i 7 (0 thø hai)$where = index(“hello world”, “o”, 8); # cho l¹i -1 (hÕt sau

8)§i theo lèi kh¸c, b¹n cã thÓ nhßm tõ bªn ph¶i ®Ó cã ®îc sù

xuÊt hiÖn bªn ph¶i nhÊt b»ng viÖc dïng rindex(). Gi¸ trÞ cho l¹i vÉn lµ sè c¸c kÝ tù gi÷a ®Çu bªn tr¸i cña x©u vµ chç b¾t ®Çu cña x©u con, nh tríc, nhng b¹n sÏ nhËn ®îc sù xuÊt hiÖn vÒ bªn ph¶i nhÊt thay v× sù xuÊt hiÖn bªn tr¸i nhÊt nÕu cã nhiÒu sù xuÊt hiÖn. To¸n tö rindex() còng nhËn tham biÕn thø ba gièng nh index() , ®Ó cho b¹n cã thÓ cã ®îc sù xuÊt hiÖn Ýt h¬n hay b»ng vÞ trÝ ®· chän. Sau ®©y lµ mét sè thÝ dô vÒ ®iÒu b¹n nhËn ®îc:

$w = rindex(“hello world”, “he”); # $w nhËn 0$w = rindex(“hello world”, “l”); # $w nhËn 9 (l bªn ph¶i

nhÊt)$w = rindex(“hello world”, “o”); # $w nhËn 7$w = rindex(“hello world”, “o ”); # $w nhËn 4$w = rindex(“hello world”, “xx”); # $w nhËn -1 (kh«ng

thÊy)$w = rindex(“hello world”, “o”, 6); # $w nhËn 4 (®Çu tiªn

tríc 6)$w = rindex(“hello world”,“o”, 3); # $w nhËn -1 (kh«ng

thÊy tríc 3)TrÝch vµ thay thÕ mét x©u con

ViÖc lÊy ra mét mÈu cña x©u cã thÓ ®îc thùc hiÖn b»ng viÖc ¸p dông cÈn thËn c¸c biÓu thøc chÝnh qui, nhng nÕu mÈu nµy bao giê còng ë t¹i mét vÞ trÝ kÝ tù ®· biÕt, th× viÖc nµy lµ kh«ng hiÖu qu¶. Thay v× vËy, b¹n nªn dïng substr(). To¸n tö nµy nhËn ba ®èi: mét gi¸ trÞ x©u, mét vÞ trÝ b¾t ®Çu (®îc ®o tùa nh nã ®· ®îc ®o cho index()), vµ mét chiÒu dµi, gièng nh:

$s = substr ($string, $start, $length);VÞ trÝ b¾t ®Çu lµm viÖc gièng nh index; kÝ tù ®Çu tiªn lµ

kh«ng, kÝ tù thø hai lµ mét, vµ cø thÕ. ChiÒu dµi lµ sè c¸c kÝ tù

Page 147: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

cÇn n¾m lÊy t¹i ®iÓm ®ã: chiÒu dµi b»ng kh«ng cã nghÜa lµ kh«ng cã kÝ tù nµo, b»ng mét cã nghÜa lµ lÊy kÝ tù ®Çu tiªn, b»ng hai cã nghÜa lµ hai kÝ tù, vµ v©n v©n. (Nã dõng l¹i t¹i cuèi x©u, cho nªn nÕu b¹n t×m kiÕm qu¸ nhiÒu, th× còng kh«ng sao c¶.) Nã tr«ng gièng thÕ nµy:

$hello = “hello, world!”;$grab = substr($hello, 3, 2); # $grap nhËn “lo”$grab = substr($hello, 7, 100); # 7 ®Õn cuèi, hay “world!”B¹n thËm chÝ cã thÓ t¹o ra to¸n tö “n©ng lªn luü thõa mêi”

cho c¸c sè mò nguyªn nhá, nh trong:$big = substr(“10000000000”, 0, $power+1); # 10**$powerNÕu sè ®Õm c¸c kÝ tù lµ kh«ng hay bÐ h¬n kh«ng, th× mét

x©u rçng sÏ ®îc cho l¹i. MÆt kh¸c, nÕu vÞ trÝ b¾t ®Çu lµ bÐ h¬n kh«ng th× vÞ trÝ b¾t ®Çu ®îc tÝnh theo sè c¸c kÝ tù tõ cuèi x©u. Cho nªn gi¸ trÞ -1 ®èi víi vÞ trÝ b¾t ®Çu vµ 1 (hay nhiÒu) ®èi víi chiÒu dµi sÏ cho b¹n kÝ tù cuèi. T¬ng tù, -2 cho vÞ trÝ b¾t ®Çu víi kÝ tù thø hai kÓ tõ cuèi. Gièng thÕ:

$stuff = substr(“a very long string”, -3, 3); # ba kÝ tù cuèi$stuff = substr(“a very long string”, -3, 1); # kÝ tù “i”NÕu vÞ trÝ b¾t ®Çu lµ tríc chç më ®Çu cña x©u (gièng nh

mét sè ©m khæng lå lín h¬n chiÒu dµi cña x©u), th× chç më ®Çu sÏ lµ vÞ trÝ b¾t ®Çu (dêng nh b¹n ®· dïng 0 lµm vÞ trÝ b¾t ®Çu). NÕu vÞ trÝ b¾t ®Çu lµ mét sè d¬ng khæng lå, th× x©u rçng bao giê còng ®îc cho l¹i. Nãi c¸ch kh¸c, nã cã thÓ lµm ®iÒu b¹n tr«ng ®îi nã ph¶i lµm, chõng nµo b¹n cßn tr«ng ®îi th× nã bao giê còng cho l¹i mét c¸i g× ®ã kh¸c h¬n lµ mét lçi.

Bá ®i ®èi chiÒu dµi th× còng hÖt nh b¹n ®· ®a mét sè khæng lå vµo cho ®èi ®ã - n¾m lÊy mäi thø tõ vÞ trÝ ®· chän cho tíi cuèi x©u* .

NÕu ®èi thø nhÊt cña substr() lµ mét biÕn (nãi c¸ch kh¸c, nã cã thÓ xuÊt hiÖn bªn vÕ tr¸i cña to¸n tö g¸n), th× b¶n th©n substr() còng cã thÓ xuÊt hiÖn ë vÕ bªn tr¸i cña to¸n tö g¸n. §iÒu nµy tr«ng cã vÎ k× l¹ nÕu b¹n b¾t nguån tõ nÒn t¶ng C, nhng nÕu b¹n ®· ch¬i víi vµi dÞ b¶n cña BASIC th× nã hoµn toµn lµ th«ng thêng.

§iÒu nhËn ®îc sù thay ®æi nh kÕt qu¶ cña phÐp g¸n nh thÕ lµ phÇn cña x©u sÏ ®îc cho l¹i, mµ cã substr() ®îc dïng trong mét biÓu thøc. Nãi c¸ch kh¸c, substr($var, 3, 2) cho l¹i kÝ tù thø * C¸c b¶n Perl cæ h¬n kh«ng cho phÐp bá ®i ®èi thø ba, dÉn tíi viÖc nh÷ng lËp tr×nh viªn Perl tiÒn phong ®· dïng sè khæng lå cho ®èi ®ã. B¹n cã thÓ vît qua ®iÒu nµy trong cuéc hµnh tr×nh kh¶o cæ Perl cña m×nh.

Page 148: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

t vµ thø n¨m (b¾t ®Çu tõ 3, v× sè ®Õm 2), cho nªn viÖc g¸n ®iÒu ®ã lµm thay ®æi hai kÝ tù nµy cho $var. Gièng nh:

$hw = “hello world!”;substr($hw, 0, 5) = “howdy”; # $hw b©y giê lµ “howdy

world!”ChiÒu dµi cña v¨n b¶n thay thÕ (c¸i nhËn ®îc viÖc g¸n vµo

trong substr) kh«ng ph¶i lµ cïng nh v¨n b¶n ®îc thay thÕ, nh trong thÝ dô nµy. X©u nµy sÏ tù ®éng t¨ng trëng hay co l¹i khi cÇn ®Ó ®iÒu hµo víi v¨n b¶n. Sau ®©y lµ mét thÝ dô vÒ viÖc x©u thµnh ng¾n h¬n:

substr($hw, 0, 5) = “hi”; # $hw b©y giê lµ “hi world!”vµ ®©y lµ mét x©u thµnh dµi h¬n:substr($hw, -6, 5) = “worldwide news”; # thay thÕ “world”ViÖc co l¹i hay d·n ra th× kh¸ hiÖu qu¶, cho nene b¹ n®õng

lo l¾ng vÒ viÖc dïng chóng mét c¸ch bÊt k×, mÆc dÇu viÖc thay thÕ mét x©u b»ng mét x©u chiÒu dµi t¬ng ®¬ng th× vÉn nhanh h¬n nÕu b¹n cã c¬ héi.§Þnh d¹ng d÷ liÖu b»ng sprintf()

To¸n tö printf ®«i khi còng dÔ sö dông khi ®îc dïng ®Ó lÊy mét danh s¸ch c¸c gi¸ trÞ vµ t¹o ra mét dßng ra cho hiÓn thÞ c¸c gi¸ trÞ ®ã theo c¸ch ®iÒu khiÓn ®îc. To¸n tö sprintf() lµ ®ång nhÊt víi printf vÒ c¸c ®èi, nhng cho l¹i bÊt k× c¸i g× ®· ®îc printf ®a ra nh mét x©u riªng biÖt. (h·y nghÜ vÒ ®iÒu nµy nh “x©u printf”.) Ch¼ng h¹n, ®Ó t¹o ra mét x©u bao gåm ch÷ X theo sau bëi mét gi¸ trÞ n¨m ch÷ sè lÊp ®Çy bëi kh«ng cña $y, còng dÔ dµng nh:

$result = sprintf(“X%05d”, $y);NÕu b¹n kh«ng quen thuéc víi x©u ®Þnh d¹ng cña printf vµ

sprintf, th× h·y tham kh¶o vµo tµi liÖu printf hay sprintf. (Tªn sprintf, trong thùc tÕ cã nguån gèc tõ tr×nh th viÖn cïng tªn.)S¾p xÕp n©ng cao

Tríc ®©y, b¹n ®· biÕt r»ng b¹n cã thÓ lÊy mét danh s¸ch råi s¾p xÕp nã theo thø tù ASCII t¨ng dÇn (nh c¸c x©u), b»ng c¸ch dïng to¸n tö sort cã s½n. §iÒu g× sÏ xÈy ra nÕu b¹n kh«ng muèn s¾p xÕp theo thø tù ASCII t¨ng dÇn, mµ thay v× thÕ lµ mét c¸i g× ®ã kh¸c, kiÓu nh s¾p xÕp sè? §îc, Perl cho b¹n c«ng cô b¹n cÇn ®Ó lµm viÖc nµy. Trong thùc tÕ, b¹n sÏ thÊy r»ng sort cña Perl lµ hoµn toµn tæng qu¸t vµ cã thÓ thùc hiÖn bÊt k× thø tù s¾p xÕp nµo.

Page 149: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

§Ó ®Þnh nghÜa viÖc s¾p xÕp theo mÇu s¾c kh¸c, b¹n cÇn ®Þnh nghÜa mét tr×nh so s¸nh mµ m« t¶ cho c¸ch so s¸nh hai phÇn tö. T¹i sao ®iÒu nµy l¹i cÇn thiÕt? §îc, nÕu b¹n nghÜ vÒ nã, th× s¾p xÕp lµ viÖc ®Æt mét bã c¸c thø theo mét trËt tù so s¸nh tÊt c¶ chóng víi nhau. V× b¹n kh«ng thÓ nµo so s¸nh chóng ngay mét lóc nªn b¹n cÇn so s¸nh hai phÇn tö mçi lóc, ®Ó cuèi cïng dïng c¸i b¹n ph¸t hiÖn ra vÒ thø tù cho tõng cÆp mµ ®Æt toµn bé c¶ lò vµo hµng.

Tr×nh so s¸nh ®îc ®Þnh nghÜa nh mét tr×nh th«ng thêng. Tr×nh nµy sÏ ®îc gäi ®i gäi l¹i, mçi lÇn l¹i truyÒn hai phÇn tö cña danh s¸ch cÇn ®îc s¾p. Tr×nh nµy ph¶i x¸c ®Þnh liÖu gi¸ trÞ thø nhÊt lµ bÐ h¬n, b»ng hay lín h¬n gi¸ trÞ thø hai, vµ cho l¹i mét gi¸ trÞ m· ho¸ (sÏ ®îc m« t¶ ngay sau ®©y). TiÕn tr×nh nµy ®îc lÆp l¹i cho tíi khi danh s¸ch ®îc s¾p hoµn toµn.

§Ó tiÕt kiÖm tèc ®é thùc hiÖn mét chót, hai gi¸ trÞ nµy kh«ng ®îc truyÒn trong ¶ng, mµ thay v× thÕ ®îc trao cho mét tr×nh con nh gi¸ trÞ cña biÕn toµn côc $a vµ $b. (B¹n ®õng lo - gi¸ trÞ nguyªn thuû cña $a vµ $b ®îc b¶o vÖ an toµn.) Tr×nh nµy nªn cho l¹i mét gi¸ trÞ ©m nµo ®ã nÕu $a “bÐ h¬n’ $b, b»ng kh«ng nÕu $a “b»ng” $b, vµ bÊt k× sè d¬ng nµo nÕu $a “lín h¬n” $b. B©y giê b¹n h·y nhí, “bÐ h¬n” lµ t¬ng øng víi ý nghÜa cña b¹n vÒ “bÐ h¬n” - nã cã thÓ lµ mét so s¸nh sè, t¬ng øng víi kÝ tù thø ba cña x©u, hay thËm chÝ t¬ng øng víi gi¸ trÞ cña bÊt k× m¶ng nµo cã dïng c¸c gi¸ trÞ ®îc truyÒn vµo nh kho¸. §Êy míi thùc sù lµ mÒm dÎo.

Sau ®©y lµ mét thÝ dô vÒ mét ch¬ng tr×nh con s¾p xÕp mµ sÏ s¾p mäi thø theo thø tù sè:

sub by_number {if ($a < $b) {

-1;} elsif ($a == $b) {

0;} elsif ($a > $b) {

1;}

}B¹n h·y chó ý ®Õn tªn by_number. Kh«ng cã g× ®Æc biÖt

vÒ c¸i tªn cña tr×nh con nµy, nhng b¹n sÏ thÊy t¹i sao t«i l¹i thÝch c¸i tªn b¾t ®Çu bëi by_ trong gi©y l¸t.

Ta h·y nh×n qua tr×nh con nµy. NÕu gi¸ trÞ cña $a lµ bÐ h¬n (vÒ mÆt sè trong trêng hîp nµy) gi¸ trÞ cña $b, thf ta cho l¹i gi¸ trÞ -1. NÕu c¸c gi¸ trÞ lµ b»ng nhau vÒ con sè th× ta cho

Page 150: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

l¹i kh«ng, cßn ngoµi ra cho l¹i 1. VËy, theo m« t¶ cña ta cho tr×nh so s¸nh s¾p xÕp th× ®iÒu nµy sÏ lµm viÖc.

Lµm sao ta dïng ®îc nã? Ta h·y thö s¾p xÕp danh s¸ch sau.$somelist = (1,2,4,8,16,32,64,128,256);NÕu ta dïng sort th«ng thêng kh«ng sang söa l¹i danh s¸ch

th× ta sÏ ®îc c¸c sè s¾p nh chóng lµ c¸c x©u, vµ theo trËt tù ASCII, tùa nh:

@wronglist = sort @somelist;# @wronglist b©y giê lµ (1,128,16,2,256,32,64,8)Ch¾c ch¾n ®Êy kh«ng ph¶i lµ s¾p xÕp sè. Th«i ®îc, ta sÏ

cho sort mét tr×nh s¾p xÕp ®îc ®Þnh nghÜa míi. Tªn cña tr×nh s¾p xÕp ®i ngay sau tõ kho¸ sort, nh:

@rightlist = sort by_number @wronglist;# @rightlist b©y giê lµ (1,2,4,8,32,64,128,256)§©y qu¶ lµ mÑo. Chó ý r»ng b¹n cã thÓ ®äc sort víi tr×nh

con s¾p xÕp ®i kÌm theo kiÓu con ngêi: “s¾p xÕp theo sè”. §ã lµ lÝ do t¹i sao t«i ®Æt tªn cho tr×nh con víi tiÒn tè by_.

NÕu b¹n còng thiªn vÒ nh thÕ vµ muèn nhÊn m¹nh r»ng c¸i ®i sau sort lµ mét tr×nh con, th× b¹n cã thÓ ®Æt tríc nã b»ng mét dÊu vµ (&), khi ®ã Perl sÏ kh«ng bËn t©m n÷a, nhng nã ®· biÕt r»ng c¸i n»m gi÷a tõ kho¸ sort vµ danh s¸ch ph¶i lµ mét tªn tr×nh con.

C¸i lo¹i gi¸ trÞ ba ng¶ kiÓu -1, 0, 1 dùa trªn c¬ së so s¸nh sè thêng xuÊt hiÖn trong tr×nh con so s¸nh ®Õn møc Perl cã mét to¸n tö ®Æc biÖt ®Ó lµm ®iÒu nµy trong mét lÇn. nã thêng ®-îc gäi lµ to¸n tö tÇu vò trô, vµ tr«ng gièng <=>. Dïng to¸n tö tÇu vò trô nµy, tr×nh con s¾p xÕp trªn ®©y cã thÓ ®îc thay thÕ b»ng:

sub by_number {$a <=> $b;

}B¹n h·y chó ý ®Õn con tÇu vò trô gi÷a hai biÕn nµy. Qu¶

vËy, nã thùc lµ to¸n tö dµi ba kÝ tù. Con tÇu vò trô cho l¹i cïng gi¸ trÞ nh d©y chuyÒn if/elsif trong ®Þnh nghÜa tríc cña tr×nh nµy. B©y giê ®iÒu nµy lµ cã ng¾n gän, nhng b¹n cã thÓ viÕt t¾t lêi gäi s¾p xÕp thªm n÷a, b»ng viÖc thay thÕ tªn cña tr×nh s¾p xÕp b»ng toµn bé tr×nh s¾p xÕp trong dßng, gièng nh:

@rightlist = sort { $a <=> $b } @wronglist;

Page 151: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Mét sè ngêi biÖn minh r»ng ®iÒu nµy lµm gi¶m tÝnh dÔ ®äc. Mét sè kh¸c th× l¹i biÖn minh r»ng nã lo¹i bá nhu cÇu ph¶i ®i ®©u ®ã ®Ó t×m ra ®Þnh nghÜa. Perl ch¼ng quan t©m ®Õn ®iÒu ®ã. Qui t¾c c¸ nh©n cña t«i lµ ë chç nÕu nã kh«ng khíp trªn mét dßng hay t«i ph¶i dïng nã nhiÒu lÇn, th× nã nªn thµnh mét tr×nh con.

To¸n tö tÇu vò trô dµnh cho so s¸nh sè, cã to¸n tö x©u so s¸nh gäi lµ cmp. To¸n tö cmp cho l¹i mét trong ba gi¸ trÞ tuú theo viÖc so s¸nh x©u t¬ng ®èi cña hai ®èi. Cho nªn, mét c¸ch kh¸c ®Ó viÕt trËt tù mÆc ®Þnh lµ:

@result = sort { $a cmp $b } @somelist;Cã lÏ b¹n cßn cha hÒ viÕt tr×nh con ®Ých x¸c nµy (b¾t chíc

s¾p xÕp mÆc ®Þnh cã s½n), chõng nµo b¹n cßn cha viÕt mét cuèn s¸ch vÒ Perl. Tuy thÕ, to¸n tö cmp vÉn cã Ých lîi cña nã, trong viÖc x©y dùng c¸c lîc ®å s¾p thø tù theo tÇng. Ch¼ng h¹n, b¹n kh«ng cÇn ®Æt c¸c phÇn tö theo thø tù sè chõng nµo chóng kh«ng b»ng nhau vÒ mÆt sè, vµ trong trêng hîp ®ã chóng ph¶i ®îc s¾p theo trËt tù ASCII. (Theo ngÇm ®Þnh, tr×nh by_number trªn sÏ chØ dïng cho c¸c x©u phi sè theo mét trËt tù ngÉu nhiªn nµo ®ã v× kh«ng cã trËt tù sè khi so s¸nh hai gi¸ trÞ kh«ng.) Sau ®©y lµ mét c¸ch nãi “cÇn so s¸nh theo sè, chõng nµo chóng cha b»ng nhau vÒ sè, cßn th× so s¸nh theo x©u”:

sub by_mostly_number {($a <=> $b) || ($a cmp $b);

}§iÒu nµy lµm viÖc thÕ nµo? ThÕ nµy, nÕu kÕt qu¶ cña tÇu

vò trô lµ -1 hay 1 th× phÇn cßn l¹i cña biÓu thøc bÞ bá qua, vµ gi¸ trÞ -1 hay 1 ®îc cho l¹i. NÐu tÇu vò trô tÝnh ra gi¸ trÞ kh«ng th× to¸n tö cmp trë thµnh quan träng, cho l¹i mét gi¸ trÞ thø tù thÝch hîp xem nh gi¸ trÞ cña x©u.

Gi¸ trÞ ®îc so s¸nh kh«ng nhÊt thiÕt lµ gi¸ trÞ ®îc truyÒn vµo. Ch¼ng h¹n, b¹n cã mét m¶ng kÕt hîp trong ®ã kho¸ lµ tªn ®¨ng nhËp vµ c¸c gi¸ trÞ lµ tªn thËt cña tõng ngêi dïng. Gi¶ sö b¹n muèn in ra mét biÓu ®å trong ®ã tªn ®¨ng nhËp vµ tªn thËt ®îc cÊt gi÷ theo thø tù tªn thËt. B¹n sÏ lµm ®iÒu ®ã nh thÕ nµo?

Thùc t¹i, viÖc Êy kh¸ dÔ dµng. Ta h·y gi¶ sö c¸c gi¸ trÞ lµ trong m¶ng %names. Tªn ®¨ng nhËp vËy lµ danh s¸ch cña key(%names). §iÒu ta muèn ®¹t tíi lµ mét danh s¸ch c¸c tªn ®¨ng nhËp ®îc s¾p theo gi¸ trÞ t¬ng øng, vËy víi bÊt k× kho¸ riªng $a nµo, ta cÇn nh×n vµo $names{$a} vµ s¾p xÕp dùa

Page 152: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

trªn ®iÒu ®ã. NÕu b¹n nghÜ vÒ ®iÒu nµy theo c¸ch ®ã th× nã gÇn nhu ®· tù viÕt ra råi, nh trong:

@sortedkeys = sort by_names keys(%names);sub by_names {

$names{$a} cmp $names{$b};}foreach (@sortedkeys) {

print “$_ cã tªn thËt lµ $names{$_}\n”;}Víi ®iÒu nµy t«i còng ®· thªm vµo mét so s¸nh. Gi¶ sö tªn

thËt cña hai ngêi dïng lµ trïng nhau. V× b¶n chÊt chît nÈy ra cña tr×nh sort, t«i cã thÓ lÊy mét gi¸ trÞ nµy tríc gi¸ trÞ kia lÇn ®Çu tiªn råi c¸c gi¸ trÞ theo thø tù ®¶o l¹i cho lÇn sau. §iÒu nµy kh«ng tèt nÕu b¸o c¸o cã thÓ ®îc n¹p vµo ch¬ng tr×nh so s¸nh cho viÖc b¸o c¸o, cho nªn t«i ph¶i rÊt cè g¾ng tr¸nh nh÷ng thø nh vËy. Víi to¸n tö cmp, thËt dÔ dµng:

sub by_names {($names{$a} cmp $names{$b}) || ($a cmp $b);

}T¹i ®©y, nÕu tªn thùc lµ gièng nhau th× t«i s¾p xÕp dùa

trªn tªn ®¨ng nhËp. V× tªn ®¨ng nhËp ®îc ®¶m b¶o lµ duy nhÊt (sau rèt, chóng lµ c¸c kho¸ cña m¶ng kÕt hîp nµy, vµ kh«ng cã hai kho¸ nµo lµ nh nhau), nªn t«i cã thÓ ®¶m b¶o mét trËt tù duy nhÊt vµ lÆp l¹i ®îc. ViÖc lËp tr×nh phßng ngù tèt trong nh÷ng ngµy nµy th× tèt h¬n lµ mét có ®iÖn tho¹i gäi ®ªm cña thao t¸c viªn ®Ó hái lµm sao t¾t ®i cßi b¸o ®éng.ChuyÓn tù

Khi b¹n muèn lÊy mét x©u vµ thay thÕ mäi thÓ nghiÖm cña mét kÝ tù nµo ®ã b»ng mét kÝ tù míi, hay xo¸ mäi thÓ nghiÖm cña mét kÝ tù nµo ®ã, th× b¹n cã thÓ ®· lµm ®iÒu ®ã víi viÖc chän lùa cÈn thËn chØ lÖnh s///. Nhng gi¶ sö b¹n ph¶i thay ®æi tÊt c¶ c¸c a thµnh b vµ tÊt c¶ c¸c b thµnh a th× sao? B¹n kh«ng thÓ lµm ®iÒu ®ã víi hai chØ lÖnh s/// v× chØ lÖnh thø hai sÏ hoµn t¸c l¹i tÊt c¶ nh÷ng thay ®æi do chØ lÖnh thø nhÊt thùc hiÖn.

Tuy nhiªn tõ vá, mét phÐp chuyÓn ®æi d÷ liÖu nh vËy lµ ®¬n gi¶n - chØ cÇn dïng chØ lÖnh tr chuÈn:

tr ab ba < indata >outdata(NÕu b¹n kh«ng biÕt g× vÒ chØ lÖnh tr, xin xem tµi liÖu -

®ã lµ mét c«ng cô cã Ých cho tói c¸c mÑo cña b¹n.) T¬ng tù,

Page 153: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Perl cung cÊp mét to¸n tö tr lµm viÖc rÊt gièng nh thÕ:tr/ab/ba/;To¸n tö tr nhËn hai ®èi : x©u cò vµ x©u míi. C¸c ®èi nµy

lµm viÖc gièng nh hai ®èi cña s///: nãi c¸ch kh¸c, cã mét ®Þnh bªn nµo ®ã xuÊt hiÖn ngay sau tõ kho¸ tr lµm t¸ch biÖt vµ kÕt thóc hai ®èi (trong trêng hîp nµy, mét sæ chÐo, nhng gÇn nh kÝ tù nµo còng ®îc).

C¸c ®èi cho to¸n tö tr gièng hÖt nh c¸c ®èi cña chØ lÖnh tr. To¸n tö tr söa ®æi néi dung cña biÕn $_ (gièng nh s///), t×m c¸c kÝ tù cña x©u cò bªn trong biÕn $_. TÊt c¶ c¸c kÝ tù nh thÕ ®îc t×m thÊy ®Òu ®îc thay thÕ b»ng kÝ tù t¬ng øng trong x©u míi. Sau ®©y lµ mét sè thÝ dô:

$_ = “fred and barney”;tr/fb/bf/; # $_ b©y giê lµ “bred and farney”tr/abcde/ABCDE/; # $_ b©y giê lµ “BrED AnD fArnEy”tr/a-z/A-Z/; # $_ b©y giê lµ “BRED AND FARNEY”B¹n h·y lu ý ®Õn ph¹m vi c¸c kÝ tù cã thÓ ®îc chØ ra b»ng

hai kÝ tù ®îc ph©n c¸ch bëi sæ chÐo. NÕu b¹n cÇn mét sæ chÐo h»ng kÝ tù trong x©u th× h·y ®Æt tríc nã mét sæ chÐo ngîc.

NÕu x©u míi ng¾n h¬n x©u cò, th× kÝ tù cuèi cïng cña x©u míi sÏ ®îc lÆp l¹i ®ñ sè lÇn ®Ó lµm cho c¸c x©u cã chiÒu dµi nh nhau, gièng nh:

$_ = “fred and barney”;tr/a-z/ABCDE/d; # $_ b©y giê lµ “ED AD BAE”B¹n h·y lu ý ®Õn c¸ch thøc mäi ch÷ sau e ®Òu biÕn mÊt v×

kh«ng cã kÝ tù t¬ng øng trong danh s¸ch míi vµ r»ng c¸c dÊu c¸ch kh«ng bÞ t¸c ®éng v× chóng kh«ng xuÊt hiÖn trong danh s¸ch cò. §iÒu nµy lµ t¬ng tù víi thao t¸c cña tuú chän -d cña chØ lÖnh tr.

NÕu danh s¸ch míi lµ rçng vµ nÕu kh«ng cã tuú chän d th× danh s¸ch míi lµ gièng hÖt danh s¸ch cò. §iÒu nµy cã vÎ h¬i ngu, v× t¹i sao ph¶ti thay thÕ I cho I vµ 2 cho 2, nhng thùc tÕ th× nã còng lµm ®«i ®iÒu Ých lîi ®Êy. Gi¸ trÞ cho l¹i cña to¸n tö tr/// lµ sè c¸c kÝ tù ®îc s¸nh theo x©u cò, vµ b»ng viÖc thay ®æi c¸c kÝ tù trong chÝnh chóng, b¹n cã thÓ nhËn ®îc sè c¸c lo¹i kÝ tù ®ã bªn trong x©u. Ch¼ng h¹n:

$_ = “fred and barney”;$count = tr/a-z//; # $_ kh«ng thay ®æi nhng $count lµ 13$count2 = tr/a-z/A-Z/; # $_ lµ ch÷ hoa cßn $count2 lµ 13

Page 154: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

NÕu b¹n thªm c vµo cuèi (gièng nh viÕt thªm d) th× ®iÒu ®ã cã nghÜa lµ lµm ®Çy ®ñ x©u cò ®èi víi tÊt c¶ 256 kÝ tù. BÊt k× kÝ tù nµo b¹n liÖt kª trong x©u cò ®Òu bÞ lo¹i bá khái tËp tÊt c¶ c¸c kÝ tù cã thÓ; c¸c kÝ tù cßn l¹i, ®îc lÊy theo dÉy tõ thÊp ®Õn cao, tõ x©u cò. VËy, mét c¸ch ®Ó ®Õm hay thay ®æi c¸c kÝ tù phi sè trong x©u cña chóng ta cã thÓ lµ:

$_ = “fred and barney”;$count = tr/a-z//c; # $_ kh«ng ®æi, nhng $count lµ 2tr/a-z/_/c; # $_ b©y giê lµ “fred_and_barney” (phi ch÷ =>

_)tr/a-z//cd; # $_ b©y giê lµ “fredandbarney” (xo¸ kÝ tù kh¸c

ch÷)Chó ý r»ng c¸c tuú chän cã thÓ ®îc tæ hîp, nh ®îc tr×nh

bÇy trong thÝ dô cuèi, n¬i chóng ta tríc hÕt bæ dung cho tËp hîp (danh s¸ch c¸c ch÷ trë thµnh danh s¸ch cña tÊt c¶ c¸c phi ch÷) råi dïng tuú chän d ®Ó xo¸ bÊt k× kÝ tù nµo trong tËp ®ã.

Tuú chän cuèi cïng cho tr/// lµ s, mµ sÏ lµm cøng l¹i nhiÒu b¶n sao liªn tiÕp cña cïng ch÷ ®· ®îc dÞch vµo mét b¶n sao. Zem nh mét thÝ dô ta h·y nh×n vµo ®iÒu nµy:

$_ = “aaabbcccdefghi”;tr/defghi/abcdd/s; # $_ b©y giê lµ “aaabbcccabcd”Chó ý r»ng def trë thµnh abc, cßn ghi (mµ ®¸ng trë thµnh

ddd nÕu kh«ng cã tuú chän s) l¹i trë thµnh mét d. B¹n còng ®Ó ý r»ng c¸c ch÷ liªn tiÕp t¹i phÇn ®Çu cña x©u th× kh«ng bÞ ®ãng cøng l¹i v× chóng kh«ng lµ kÕt qu¶ cña viÖc dÞch. Sau ®©y lµ thªm mét sè thÝ dô n÷a:

$_ = “fred and barney, wilma and betty”;tr/a-z/X/s; # $_ b©y giê lµ “X X X, X X X”$_ = “fred and barney, wilma and betty”;tr/a-z/_/cs; # $_ b©y giê lµ

“fred_and_barney_wilma_and_betty”Trong thÝ dô thø nhÊt, mçi tõ (ch÷ liªn tiÕp) ®Òu bÞ ®ãng

cøng l¹i chØ mét ch÷ X. Trong thÝ dô thø hai, tÊt c¶ chïm c¸c phi ch÷ liªn tiÕp trë thµnh dÊu g¹ch thÊp duy nhÊt.

Gièng nh s///, to¸n tö tr cã thÓ híng ®Ých vµo mét x©u kh¸c bªn c¹nh $_ b»ng viÖc dïng to¸n tö =~:

$name = “fred and barney”;$name =~ tr/aeiou/X/; # $name b©y giê lµ “frXd Xnd

bXrnXy”

Page 155: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Bµi tËpXem Phô lôc A vÒ lêi gi¶i

1. H·y viÕt mét ch¬ng tr×nh ®Ó ®äc mét danh s¸ch tªn tÖp, bÎ mçi tªn thµnh phÇn ®Çu vµ ®u«i. (Mäi thø cho tíi dÊu sæ chÐo cuèi cïng ®Òu lµ ®Çu, cßn mäi thø sau dÊu sæ chÐo cuèi cïng lµ ®u«i. NÕu kh«ng cã sæ chÐo th× nã tÊt c¶ lµ ®u«i.) B¹n h·y thö víi nh÷ng thø nh /fred, barney vµ fred/barney. KÕt qu¶ cã nghÜa g× kh«ng?

2. H·y viÕt mét ch¬ng tr×nh ®Ó ®äc vµo mét danh s¸ch c¸c sè råi s¾p xÕp chóng theo thø tù sè, in ra danh s¸ch kÕt qu¶ theo cét th¼ng lÒ ph¶i.

3. H·y viÕt mét ch¬ng tr×nh in ra c¸c tªn thùc vµ tªn ®¨ng nhËp cña ngêi dïng trong tÖp /etc/passwd, ®îc s¾p theo tªn cuèi cña tõng ngêi dïng. Gi¶i ph¸p cña b¹n cã lµm viÖc nÕu hai ngêi cã cïng tªn cuèi kh«ng?

4. H·y t¹o ra mét tÖp bao gåm c¸c c©u, mçi c©u mét dßng. H·y viÕt mét ch¬ng tr×nh lµm cho mçi kÝ tù ®Çu c©u trë thµnh ch÷ hoa, cßn phÇn cßn l¹i cña c©u thµnh ch÷ thêng. (LiÖu nã cã lµm viÖc c¶ khi kÝ tù ®Çu tiªn kh«ng ph¶i lµ mét ch÷ kh«ng? B¹n lµm ®iÒu nµy thÕ nµo nÕu c©u kh«ng trªn mét dßng?)

Page 156: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

16

Th©m nhËp c¬ së d÷ liÖu hÖ thèng

Page 157: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

17

Thao t¸c c¬ së d÷ liÖu ngêi dïng

C¬ së d÷ liÖu DBM vµ m¶ng DBMPhÇn lín c¸c hÖ thèng UNIX ®Òu cã mét th viÖn chuÈn gäi lµ

DBM. Th viÖn nµy cung cÊp mét tiÖn nghi qu¶n trÞ c¬ së d÷ liÖu ®¬n gi¶n mµ cho phÐp c¸c ch¬ng tr×nh ®îc cÊt gi÷ mét tuyÓn tËp c¸c cÆp kho¸-gi¸ trÞ trong mét cÆp tÖp ®Üa. Nh÷ng tÖp nµy duy tr× c¸c gi¸ trÞ trong c¬ së d÷ liÖu gi÷a nh÷ng lÇn gäi ch¬ng tr×nh cã dïng c¬ së d÷ liÖu vµ nh÷ng ch¬ng tr×nh nµy cã thÓ bæ sung c¸c gi¸ trÞ míi, cËp nhËt c¸c gi¸ trÞ hiÖn cã, hay xo¸ c¸c gi¸ trÞ cò.

Th viÖn DBM th× kh¸ ®¬n gi¶n, nhng l¹i s½n cã, mét sè ch-¬ng tr×nh hÖ thèng ®· dïng nã cho nh÷ng nhu cÇu kh¸ gi¶n dÞ cña chóng. Ch¼ng h¹n, ch¬ng tr×nh göi th Berkeley (vµ c¸c biÕn thÓ cïng suy dÉn cña nã) cÊt gi÷ c¬ së d÷ liÖu biÖt hiÖu (¸nh x¹ cña ®Þa chØ th vµo n¬i nhËn) nh mét c¬ së d÷ liÖu DBM. PhÇn mÒm tin Usenet phñ cËp nhÊt còng dïng c¬ së d÷ liÖu DBM ®Ó gi÷ dÊu vÕt cac bµi b¸o hiÖn t¹i vµ míi xem gÇn ®Êy.

Perl cung cÊp viÖc th©m nhËp vµo cïng c¬ chÕ DBM nµy th«ng qua mét ph¬ng tiÖn cßn th«ng minh h¬n: m¶ng kÕt hîp cã thÓ ®îc kÕt hîp víi c¬ së d÷ liÖu DBM qua mét tiÕn tr×nh t-¬ng tù nh më mét tËp. M¶ng kÕt hîp nµy (cßn gäi lµ m¶ng DBM) vËy råi ®îc dïng ®Ó th©m nhËp vµ söa ®æi c¬ së d÷ liÖu DBM. ViÖc t¹o ra mét phÇn tö míi trong m¶ng nµy lµm thay ®æi ngay lËp tøc c¬ së d÷ liÖu DBM. ViÖc xo¸ mét phÇn tö sÏ xo¸ gi¸ trÞ khái c¬ së d÷ liÖu DBM. Vµ cø nh thÕ.

KÝch cì, sè lîng vµ lo¹i kho¸ cïng gi¸ trÞ trong c¬ së d÷ liÖu DBM th× cã h¹n chÕ, vµ mét m¶ng DBM cã cïng nh÷ng h¹n chÕ ®ã. B¹n h·y xem lidbm vÒ chi tiÕt. Nãi chung, nÕu b¹n gi÷ c¶ kho¸ vµ gi¸ trÞ xuèng kho¶ng 1000 kÝ tù bÊt k× hay Ýt h¬n th× cã lÏ lµ OK.Më vµ ®ãng m¶ng DBM

§Ó kÕt hîp mét c¬ së d÷ liÖu DBM víi mét m¶ng DBM, b¹n h·y dïng to¸n tö dbmopen() , tr«ng nh thÕ nµy:

dbmopen(%ARRAYNAME, “dbmfilename”, $mode);

Page 158: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Tham biÕn %ARRAYNAME lµ mét m¶ng kÕt hîp cña Perl. (NÕu m¶ng nµy ®· cã gi¸ trÞ th× c¸c gi¸ trÞ ®ã ®Òu bÞ bá ®i.) M¶ng kÕt hîp nµy trë thµnh ®îc nèi víi c¬ së d÷ liÖu DBM cã tªn dbmfilename, th«ng thêng ®îc cÊt gi÷ trªn ®Üa nh mét cÆp tÖp cã tªn dbmfilenam.dir vµ dbmfilename.pag. BÊt k× tªn m¶ng kÕt hîp hîp ph¸p nµo còng ®Òu cã thÓ dïng ®îc, mÆc dÇu c¸c tªn m¶ng chØ toµn ch÷ hoa th× ®îc dïng ®iÓn h×nh do sù t¬ng tù víi tíc hiÖu tÖp.

Tham biÕn $mode lµ mét sè kiÓm so¸t c¸c bit cho phÐp cña cÆp tÖp nµy nÕu c¸c tÖp ®ã cÇn ®îc t¹o ra. Con sè nµy ®iÓn h×nh ®îc x¸c ®Þnh theo hÖ t¸m: gi¸ trÞ thêng hay dïng nhÊt lµ 0644 cho phÐp mäi ngêi chØ ®äc, cßn riªng ngêi chñ th× cã phÐp ®äc-ghi. NÕu c¸c tÖp nµy ®· tån t¹i th× tham biÕn nµy kh«ng cã t¸c dông. Ch¼ng h¹n:

dbmopen(%FRED, “mydatabase”, 0644); # më %FRED lªn mydatabase

Lêi gäi nµy kÕt hîp m¶ng kÕt hîp %FRED víi c¸c tÖp ®Üa mydatabase.dir vµ mydatabase.pag trong danh môc hiÖn t¹i. NÕu c¸c tÖp nµy cha tån t¹i th× chóng ®îc t¹o ra víi mèt 0644.

Gi¸ trÞ cho l¹i tõ dbmopen() lµ ®óng nÕu c¬ së d÷ liÖu cã thÓ më ®îc hay t¹o ra ®îc, vµ lµ sai trong trêng hîp ngîc l¹i, hÖt nh viÖc gäi open(). NÕu b¹n kh«ng muèn c¸c tÖp nµy ®îc t¹o ra th× h·y dïng gi¸ trÞ $mode cña undef. Ch¼ng h¹n:

dbmode (%A, “/etc/xx”, undef) || die “kh«ng më ®îc DBM /etc/xx”;

Trong trêng hîp nµy, nÕu tÖp /etc/xx.dir vµ /etc/xx.pag kh«ng thÓ më ®îc th× lêi gäi dbmopen() sÏ cho l¹i sai, thay v× cè g¾ng t¹o ra c¸c tÖp nµy.

M¶ng DBM vÉn cßn më trong suèt lóc thùc hiÖn ch¬ng tr×nh. Khi ch¬ng tr×nh kÕt thóc th× sù kÕt hîp sÏ kÕt thóc. B¹n còng cã thÓ ph¸ vì sù kÕt hîp theo c¸ch thøc t¬ng tù nh viÖc ®ãng tíc hiÖu tÖp, b»ng viÖc dïng to¸n tö dbmclose():

dbmclose(%A);Gièng nh close(), dbmclose() cho l¹i sai nÕu ®iÒu g× ®ã ®i

sai.Dïng m¶ng DBM

Mét khi c¬ së d÷ liÖu ®· ®îc më th× c¸c tham kh¶o tíi m¶ng DBM sÏ ®îc ¸nh x¹ vµo c¸c tham kh¶o c¬ së d÷ liÖu. ViÖc thay ®æi hay bæ sung gi¸ trÞ vµo m¶ng nµy t¹o ra cho c¸c môc t¬ng øng lËp tøc ®îc ghi vµo tÖp ®Üa. Ch¼ng h¹n, mét khi

Page 159: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

%FRED ®îc më trong thÝ dô tríc, th× ta cã thÓ thªm vµo, xo¸ bá hay th©m nhËp vµo c¬ së d÷ liÖu, gièng nh thÕ nµy:

$FRED{“fred”} = “bedrok”; # t¹o ra (cËp nhËt) mét phÇn tödelete $FRED{“barney”); # bá mét phÇn tö cña csdl foreach $key (keys %FRED) { # ®i qua mäi gi¸ trÞ

print “$key cã gi¸ trÞ cña $FRED{$key}\n”;}Chu tr×nh cuèi ph¶i nhßm qua toµn bé tÖp ®Üa hai lÇn: mét

lÇn ®Ó th©m nhËp vµo kho¸, vµ lÇn thø hai ®Ó tra cøu c¸c gi¸ trÞ tõ kho¸. NÕu chóng ta nhßm qua mét m¶ng DBM th× nãi chung sÏ hiÖu qu¶ vÒ ®Üa h¬n lµ dïng to¸n tö each(), chØ qua mét bíc:

while ( ($key, $value) = each (%FRED)) {print “$key cã gi¸ trÞ cña $value\n”;

}NÕu b¹n ®ang th©m nhËp vµo c¬ së d÷ liÖu DBM hÖ thèng,

nh c¸c c¬ së d÷ liÖu ®· ®îc t¹o ra bëi sendmail hay tin Usenet, th× b¹n ph¶i biÕt r»ng c¸c ch¬ng tr×nh nãi chung ®Òu g¾n thªm c¸i ®u«i kÝ tù NUL (“\0”) vµo cuèi cña c¸c x©u nµy. C¸c tr×nh th viÖn DBM kh«ng cÇn c¸i NUL nµy (chóng gi¶i quyÕt d÷ liÖu nhÞ ph©n b»ng c¸ch ®Õm byte chø kh«ng ph¶i lµ x©u kÕt thóc b»ng NUL), vµ do vËy NUL ®îc cÊt gi÷ nh mét phÇn cña d÷ liÖu. Do ®ã b¹n ph¶i g¾n kÝ tù NUL vµo cuèi d÷ liÖu cña m×nh vµ bá NUL khái cuèi cña gi¸ trÞ cho l¹i ®Ó cho d÷ liÖu cã nghÜa. Ch¼ng h¹n, ®Ó tra cøu merlyn trong c¬ së d÷ liÖu biÖt hiÖu, b¹n h·y thö mét ®iÒu g× ®ã kiÓu:

dbmopen(%ALI, “/etc/aliases”, undef) || die “Kh«ng biÖt hiÖu?”;

$value = $ALI{“merlyb\0”}; # lu ý NUL ®îc thªmvµochop($value); #lo¹i bá NUL ®îc thªm vµoprint “Th cña Randal ®îc g¾n ®Çu cho: $value\n”; # in kÕt

qu¶B¶n UNIX cña b¹n cã thÓ ®a c¬ së d÷ liÖu biÖt hiÖu vµo

/usr/lib thay v× /etc. B¹n ph¶i lôc läi ®Ó t×m ra.C¬ së d÷ liÖu th©m nhËp ngÉu nhiªn chiÒu dµi cè ®Þnh

Mét d¹ng kh¸c cña d÷ liÖu bÒn bØ lµ c¸c tÖp ®Üa híng b¶n ghi víi chiÒu dµi cè ®Þnh. Trong lîc ®å nµy, d÷ liÖu bao gåm mét sè c¸c b¶n ghi víi chiÒu dµi nhu nhau. ViÖc ®¸nh sè cho c¸c b¶n ghi th× kh«ng quan träng hay hay ®îc x¸c ®Þnh bëi mét lîc ®å ®Þnh chØ sè nµo ®ã.

Page 160: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Ch¼ng h¹n, chóng ta cã thÓ cã mét lo¹t c¸c b¶n ghi mµ trong ®ã d÷ liÖu cã 40 kÝ tù cña hä, mét kÝ tù tªn ®Öm, 40 kÝ tù tªn, vµ råi mét sè nguyªn hai byte cho tuæi. Mçi b¶n ghi vËy lµ cã chiÒu dµi 83 byte. NÐu ta ®äc tÊt c¶ d÷ liÖu trong c¬ së d÷ liÖu th× ta ph¶i ®äc tõng chïm 83 byte cho tíi khi ®Õn cuèi. NÕu ta muèn ®i tíi b¶n ghi thø n¨m th× ta ph¶i nhÈy qua 4 lÇm 83 byte (332 byte) vµ ®äc trùc tiÕp b¶n ghi thø n¨m.

Perl hç trî cho c¸c ch¬ng tr×nh dïng kiÓu tÖp ®Üa nh thÕ. Cã ®«i ®iÒu cÇn biÕt thªm bªn c¹nh nh÷ng ®iÒu b¹n ®· biÕt:1. Më tÖp ®Üa cho c¶ ®äc vµ ghi2. ChuyÓn quanh tÖp nµy tíi mét vÞ trÝ bÊt k×3. LÊy d÷ liÖu theo ®é dµi thay v× theo dßng míi tiÕp4. Ghi d÷ liÖu lªn theo c¸c khèi chiÒu dµi cè ®Þnh

To¸n tö open() nhËn mét dÊu céng bæ sung tríc ®Æc t¶ h-íng vµo/ra ®Ó chØ ra r»ng tÖp thùc sù ®îc më cho c¶ ®äc vµ ghi. Ch¼ng h¹n:

open(A, “+<b”); # më tÖp b ®äc/ghi (lçi nÕu kh«ng cã tÖp)open(C, “+>d”); # t¹o ra tÖp d, víi th©m nhËp ®äc/ghiopen(E, “+>>f”); # më hay t¹o tÖp f víi viÖc th©m nhËp

®äc/ghiLu ý r»ng tÊt c¶ nh÷ng ®iÒu ta ®· lµm ®Òu míi chØ lµ bæ

sung thªm dÊu céng vµo híng vµo/ra.Mét khi ta ®· thu ®îc viÖc më tÖp th× ta cÇn di chuyÓn

quanh nã. B¹n lµm ®iÒu nµy víi to¸n tö seek(), còng nhËn cïng ba tham biÕn nh tr×nh th viÖn fseek(). Tham biÕn thø nhÊt lµ t-íc hiÖu tÖp; tham biÕn thø hai lµ cho kho¶ng chªnh, ®îc diÔn gi¶i ®i kÌm víi tham biÕn thø ba. Th«ng thêng, b¹n muèn tham biÕn thø ba lµ kh«ng ®Ó cho tham biÕn thø hai chän ®îc vÞ trÝ tuyÖt ®èi cho lÇn ®äc tiÕp hay ghi tiÕp lªn tÖp. Ch¼ng h¹n, ®i tíi b¶n ghi thø n¨m trªn tíc hiÖu tÖp NAMES (nh ®îc m« t¶ ë trªn), b¹n cã thÓ lµm ®iÒu nµy:

seek(NAMES, 4*83, 0);Mét khi con trá tÖp ®· ®îc ®Þnh vÞ l¹i th× viÖc ®a vµo hay

®a ra tiÕp sÏ b¾t ®Çu tõ ®ã. Víi viÖc ®a ra, h·y dïng to¸n tö print. nhng ph¶i ch¾c ch¾n r»ng d÷ liÖu b¹n viÕt lµ ®óng chiÒu dµi. §Ó thu ®îc ®óng chiÒu dµi, chóng ta cã thÓ gäi tíi to¸n tö pack():

print NAMES pack(“A40¢40s”, $first, $middle, $last, $age);Bé x¸c ®Þnh pack() ®ã cho 49 kÝ tù ®èi víi $first, mét kÝ tù

Page 161: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

cho $middle, 40 kÝ tù n÷a cho $last vµ sè nguyªn ng¾n (2 byte) cho $age. §iÒu nµy tÝnh thµnh 83 byte chiÒu dµi, vµ sÏ ghi t¹i vÞ trÞ tÖp hiÖn t¹i ®ã.

Cuèi cïng, chóng ta cÇn lÊy ra mét b¶n ghi ®Æc biÖt. MÆc dÇu to¸n tö <NAMES> cho l¹i tÊt c¶ d÷ liÖu tõ vÞ trÝ hiÖn t¹i cho tíi dßng míi tiÕp, ®iÒu ®ã l¹i kh«ng ®óng; d÷ liÖu ®îc gi¶ thiÕt lµ chØ tr¶i trªn 83 kÝ tù vµ cã thÓ l¹i kh«ng cã dßng míi ë ®óng chç. Thay v× thÕ, ta dïng to¸n tö read(), tr«ng vµ c¸ch lµm viÖc th× hÖt nh lêi gäi hÖ thèng UNIX t¬ng øng:

$count = read(NAMES, $buf, 83);Tham biÕn thø nhÊt cña read() lµ tøc hiÖu tÖp. Tham biÕn

thø hai lµ biÕn v« híng mµ gi÷ d÷ liÖu sÏ ®îc ®äc. Tham biÕn thø ba cho sè byte cÇn ®äc. Gi¸ trÞ cho l¹i tõ read() lµ sè byte thùc tÕ ®· ®äc - ®iÓn h×nh lµ cïng sè byte ®îc yªu cÇu trõ phi tíc hiÖu tÖp kh«ng ®îc më hay b¹n qu¸ gÇn tíi cuèi tÖp.

Mét khi b¹n ®· cã d÷ liÖu 83 kÝ tù th× chØ cÇn chÆt nã ra thµnh c¸c thµnh phÇn b»ng to¸n tö unpac():

($first, $middle, $last, $age) = unpack(“A40A40s”, $buf);L ý r»ng c¸c x©u ®Þnh d¹ng cho pack vµ unpack lµ nh nhau.

PhÇn lín c¸c ch¬ng tr×nhcÊt gi÷ x©u nµy trong mét biÕn tõ ®Çu trong ch¬ng tr×nh, vµ thËm chÝ cßn tÝnh chiÒu dµi cña b¶n ghi b»ng viÖc dïng pack() thay v× bá r¶i r¸c c¸c h»ng 83 ë mäi n¬i:

$names = “A40AA40s”;$names_length = length(pack($names)) ; # cã thÓ lµ 83

C¬ së d÷ liÖu (v¨n b¶n) chiÒu dµi thay ®æiNhiÒu c¬ së d÷ liÖu hÖ thèng (vµ cã lÏ phÇn lín c¬ së d÷

liÖu do ngêi dïng t¹o ra) ®Òu lµ c¸c chuçi dßng v¨n b¶n con ng-êi ®äc ®îc,víi mét b¶n ghi trªn mçi dßng. Ch¼ng h¹n, tÖp mËt hiÖu cha mét dßng cho mçi ngêi trªn hÖ thèng, vµ tÖp m¸y chñ chøa mét dßng cho mçi tªn m¸y chñ.

RÊt thêng lµ nh÷ng c¬ së d÷ liÖu nµy ®îc cËp nhËt b»ng c¸c tr×nh soan th¶o v¨n b¶n ®¬n gi¶n. ViÖc cËp nhËt mét c¬ së d÷ liÖu nh vËy bao gåm viÖc ®äc nã tÊt c¶ vµo mét vïng trung gian (hoÆc trong bé nhí hoÆc trªn ®Üa kh¸c), thùc hiÖn nh÷ng thay ®æi cÇn thiÕt, råi hoÆc ghi kÕt qu¶ ngîc trë l¹i tÖp nguyªn thuû hoÆc t¹o ra mét tÖp míi víi cïng tªn sau khi ®· xo¸ hay ®æi tªn b¶n cò. B¹n cã thÓ coi viÖc nµy nh bíc sao chÐp - d÷ liÖu ®îc sao tõ c¬ së d÷ liÖu nguyªn gèc sang mét b¶n míi cña c¬ së d÷ liÖu Êy, tiÕn hµnh tahy ®æi trong khi sao chÐp.

Page 162: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

Perl hç trî cho viÖc so¹n th¶o kiÓu sao chÐp nµy trªn c¸c c¬ së d÷ liÖu híng dßng b»ng c¸ch dïng viÖc so¹n th¶o t¹i chç. So¹n th¶o t¹i chç lµ viÖc söa ®æi c¸ch thøc to¸n tö h×nh thoi (<>) ®äc d÷ liÖu tõ mét danh s¸ch c¸c tÖp ®îc x¸c ®Þnh trong dßng lÖnh. Th«ng thêng nhÊt th× mèt so¹n th¶o nµy ®îc th©m nhËp tíi b»ng viÖc ®Æt ®èi dßng lÖnh -i, nhng chóng ta còng cã thÓ ®Æt lÉy cho mèt so¹n th¶o t¹i chç tõ bªn trong mét ch-¬ng tr×nh, nh ®îc biÓu thÞ trong thÝ dô sau ®©y.

§Ó ®Æt lÉy cho mèt so¹n th¶o t¹i chç, b¹n h·y ®Æt mét gi¸ trÞ vµo trong biÕn v« híng $^I. Gi¸ trÞ cña biÕn nµy lµ quan träng, vµ sÏ ®îc th¶o luËn ngay ®©y.

Khi to¸n tö h×nh thoi ®îc sö dông vµ $^I cã mét gi¸ trÞ (thay v× undef), th× c¸c bíc ®îc ®¸nh dÊu ##INPLACE## trong ®o¹n m· sau ®©y sÏ ®îc thªm vµo danh s¸ch c¸c hµnh ®éng ngÇm ®Þnh mµ to¸n tö h×nh thoi nhËn:

$ARGV = shift @ARGV;open(ARGV, “<$ARGV”);rename($ARGV, “$ARGV$^I”); ## INLACE ##unlink($ARGV); ## INPLACE ##open(ARGVOUT, “>$ARGV”); ## INPLACE ##select(ARGVOUT) ; ## INPLACE ##HiÖu qu¶ lµ ë chç viÖc ®äc tõ to¸n tö h×nh thoi lÊy tõ tÖp

cò, cßn viÖc ghi lªn tíc hiÖu tÖp ngÇm ®Þnh th× l¹i chuyÓn sang mét b¶n sao míi cña tÖp nµy. TÖp cò vÉn cßn trong tÖp dù phßng, mµ chÝnh lµ tíc hiÖu tÖp víi phÇn hËu tè b»ng gi¸ trÞ cña biÕn $^I. (Còng cã mét chót ¶o thuËt ®Ó sao chÐp c¸c bit ngêi chñ vµ phÐp dïng tõ tÖp cò sang tÖp míi.) Nh÷ng bíc nµy ®îc lÆp l¹i mçi lÇn mét tÖp míi ®îc rót ra tõ m¶ng @ARGV.

C¸c gi¸ trÞ ®iÓn h×nh cho $^I lµ nh÷ng c¸i nh .bak hay ~, ®Ó t¹o ra c¸c tÖp dù phßng rÊt gièng víi tr×nh so¹n th¶o t¹o ra. Mét gi¸ trÞ k× l¹ nhng cã Ých cho $^I lµ x©u rçng, “”, c¸i g©y ra viÖc tÖp cò bÞ xo¸ s¹ch sau khi viÖc so¹n th¶o hoµn tÊt. §iÒu kh«ng may lµ nÕu hÖ thèng hay ch¬ng tr×nh bÞ háng trong khi thùc hiÖn ch¬ng tr×nh b¹n th× b¹n sÏ mÊt tÊt c¶ d÷ liÖu cò, cho nªn chóng t«i chØ khuyÕn c¸o ®iÒu nµy cho nh÷ng ngêi b¹o d¹n, d¹i dét hay tin cËy.

Sau ®©y lµ c¸ch thay ®æi viÖc ®¨ng nhËp cña ai ®ã vµo /bin/sh b»ng c¸ch söa ®æi tÖp mËt hiÖu:

@ARGV = (“/etc/passwd”); # nhåi vµo to¸n tö h×nh thoi$^I = “.bak”; # ghi /etc/passwd.bak ®Ó an toµnwhile (<>) { # chu tr×nh chÝnh, mçi lÇn cho mét dßng cña

/etc/passwd

Page 163: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃

s#L[^;]*$#:/bin/sh#; # ®æi vá thµnh /bin/shprint; # göi ra ARGVOUT: b¶n míi /etc/passwd

}Nh b¹n cã thÓ thÊy, ch¬ng tr×nh nµy kh¸ ®¬n gi¶n. Trong

thùc tÕ, cïng ch¬ng tr×nh nµy cã thÓ ®îc sinh ra toµn bé víi mét vµi ®èi dßng lÖnh nh

perl -p -i.bak -e ‘s#:[^:] ‘*$#:/bin/sh#’ /etc/passwdChuyÓn m¹ch -p ®ãng ngoÆc nhän ch¬ng tr×nh b¹n víi chu

tr×nh while cã chøa mét c©u lÖnh print. ChuyÓn m¹ch -i ®Æt mét gi¸ trÞ vµo trong biÕn $^I. ChuyÓn m¹ch -e x¸c ®Þnh ra ®èi sau ®©y nh mét phÇn cña ch¬ng tr×nh Perl ®èi víi th©n chu tr×nh; vµ ®èi cuèi cïng cho gi¸ trÞ khëi ®Çu cho @ARGV.

C¸c ®èi dßng lÖnh ®îc th¶o luËn rÊt chi tiÕt trong s¸ch con lõa vÒ perl.Bµi tËp1. H·y t¹o ra mét ch¬ng tr×nh ®Ó më c¬ së d÷ liÖu sendmail

vµ in ra tÊt c¶ c¸c môc.2. H·y t¹o ra hai ch¬ng tr×nh: mét ®äc d÷ liÖu h×nh thoi, chÆt

nã ra thµnh c¸c tõ, råi cËp nhËt mét tÖp DBM cã ghi sè lÇn xuÊt hiÖn cña tõng tõ; vµ ch¬ng tr×nh kia th× më tÖp DBN vµ cho hiÓn thÞ kÕt qu¶ ®îc s¾p xÕp theo sè ®Õm gi¶m dÇn. H·y ch¹y ch¬ng tr×nh thø nhÊt trªn vµi tÖp råi xem liÖu ch¬ng tr×nh thø hai cã nhÆt ra sè ®Õm ®óng kh«ng.

Page 164: €¦  · Web viewTrong awk hay C, b¹n ®Ó cho $ riªng hoµn toµn. NƠu b¹n cø ph¶i viƠt ®i viƠt l¹i c¸c biƠn rÊt nhỉu th× b¹n sÏ thÊy m×nh ngÉu nhiªn b̃