Professional Documents
Culture Documents
Perl
Randal L. Schwartz
Ngi dch: Ng Trung Vit
H Ni 5/1999
Learning
Perl
Randal L. Schwartz
Mc lc
1 Gii thiu .................................................................. 1
Lch s Perl ................................................................. 1
Mc ch ca Perl ....................................................... 3
Tnh sn c .............................................................. 3
H tr ...................................................................... 5
Cc khi nim c bn .................................................. 6
Do qua Perl ................................................................ 9
Chng trnh Xin cho mi ngi .................... 10
Hi cu hi v nh kt qu ................................... 11
B sung chn la .................................................. 12
on t b mt ...................................................... 13
Nhiu t b mt ..................................................... 14
Cho mi ngi mt t b mt khc nhau .............. 16
Gii quyt dng thc ci vo thay i .................. 19
Lm cho cng bng vi mi ngi ....................... 21
Lm cho n m un hn mt cht ........................ 24
Chuyn danh sch t b mt vo tp ring bit ..... 28
m bo mt lng an ton gin d ...................... 33
Cnh bo ai khi mi vic i sai ........................ 34
Nhiu tp t b mt trong danh mc hin ti ........ 36
Nhng chng ta bit h l ai! ................................ 38
Lit k cc t b mt.............................................. 40
i
Mng l g? ............................................................... 79
Biu din hng k hiu .......................................... 80
Bin ....................................................................... 81
Ton t .................................................................. 82
Php gn ................................................................ 82
Truy nhp phn t ................................................. 85
Cc ton t push() v pop() .................................. 88
Cc ton t shift() v unshift() .............................. 89
Ton t reverse() ................................................... 89
Ton t sort() ........................................................ 90
Ton t chop()....................................................... 90
Hon cnh v hng v mng .............................. 91
<STDIN> nh mt mng ...................................... 92
Xen ln bin mng ................................................ 92
Bi tp ....................................................................... 94
4 Cu trc iu khin ................................................ 97
Khi cu lnh ............................................................ 97
Cu lnh if/unless.................................................. 98
Cu lnh while/until ............................................ 101
Cu lnh for ........................................................ 103
Cu lnh foreach ................................................. 104
Bi tp ..................................................................... 106
5 Mng kt hp........................................................ 109
Mng kt hp l g? ................................................ 109
Bin mng kt hp .............................................. 110
Biu din hng k hiu cho mng kt hp........... 111
Cc ton t mng kt hp ....................................... 112
iii
Gii thiu
Lch s Perl
Perl l cch vit tt cho Practical Extraction and
Report Language Ngn ng bo co v trch rt thc
hnh, mc du n cng cn c gi l Pathologically
Eclectic Rubbish Lister - B lit k rc in t bnh
hon. Chng ch g m bin minh xem cch gi no ng
hn, v c hai u c Larry Wall, ngi sng to v
kin trc s chnh, ngi ci t v bo tr ca Perl chp
nhn. ng y to ra Perl khi c gng sn xut ra mt
s bo co t mt cp bc cc tp kiu nh th ngi
dng mng Usenet h thng bo li, v lnh awk lm
x ht hi. Larry, mt ngi lp trnh li bing, quyt
nh thanh ton vn ny bng mt cng c vn nng
m ng c th dng t nht cng mt ni khc. Kt qu
l bn u tin ca Perl.
Sau khi chi vi bn u ny ca Perl mt cht,
thm cht liu y , Larry a n cho cng ng c
1
Mc ch ca Perl
Perl c thit k tr gip cho ngi dng UNIX
vi nhng nhim v thng dng m c th rt nng n
hay qu nhy cm vi tnh kh chuyn i vi trnh v,
v cng qu k l hay ngn ngi hay phc tp lp trnh
trong C hay mt ngn ng cng c UNIX no khc.
Mt khi bn tr nn quen thuc vi Perl, bn c th
thy mnh mt t thi gian ly c trch dn trnh v
(hay khai bo C) ng, v nhiu thi gian hn c tin
trn Usenet v i trt tuyt trn i; v Perl l mt cng
c ln ta nh chic n by. Cc cu trc cht ch ca
Perl cho php bn to ra (vi ti thiu vic lm m ) mt
s gii php c u th rt trm lng hay nhng cng c
tng qut. Cng vy, bn c th li nhng cng c ny
sang cng vic tip, v Perl l kh chuyn cao v li
c sn, cho nn bn s c nhiu thi gian hn c tin
Usenet v trt tuyt.
Ging nh mi ngn ng, Perl c th ch vit - tc
l c th vit ra chng trnh m khng th no c
c. Nhng vi ch ng n, bn c th trnh c
kt ti thng thng ny. Qu th, i khi Perl trng nh
ni ting vi nhng ci khng quen thuc, nhng vi
ngi lp trnh tho Perl, n ta nh nhng dng c
tng kim tra vi mt s mnh trong cuc i. Nu bn
tun theo nhng hng dn ca cun sch ny th
chng trnh ca bn s d c v d bo tr, v chng ta
c l s thng trong bt k cuc tranh lun Perl kh hiu
no.
Tnh sn c
Nu bn nhn c
3
Cc khi nim c bn
Mt bn vit v khng g khc hn l mt dy cc
lnh v nhi vo trong mt tp vn bn. Tp ny c
lm cho chy bng cch bt mt bit thc hin (qua
chmod +x filename) v ri g tn ca tp vo li nhc
6
Do qua Perl
Chng ta bt u cuc hnh trnh ca mnh qua Perl
bng vic i do mt cht. Vic i do ny s gii thiu
mt s cc tnh nng khc nhau bng cch b sung vo
mt ng dng nh. Gii thch y l cc k ngn gn mi vng ch c tho lun chi tit hn rt nhiu
v sau trong cun sch ny. Nhng cuc i do nh ny
s cho bn kinh nghim nhanh chng v ngn ng, v
bn c th quyt nh liu bn c thc s mun kt thc
cun sch ny hay c thm cc tin Usenet hay chy i
chi trt tuyt.
10
Hi cu hi v nh kt qu
Thm mt cht phc tp hn. T Xin cho mi ngi
l mt ng chm lnh nht v cng rn. Lm cho
chng trnh gi bn theo tn bn. lm vic ny, cn
mt ch gi tn, mt cch hi tn, v mt cch nhn cu
tr li.
Mt loi t ch gi gi tr (ta nh mt tn) l bin
v hng. Vi chng trnh ny, ta s dng bin v
hng $name gi tn bn. Chng ta s i chi tit hn
trong Chng 2, D liu v hng, v nhng g m bin
ny c th gi, v nhng g bn c th lm vi chng.
Hin ti, gi s rng bn c th gi mt s hay xu (dy
cc k t) trong bin v hng.
Chng trnh ny cn hi v tn. lm iu ,
cn mt cch nhc v mt cch nhn ci vo. Chng
trnh trc ch ra cho ta cch nhc - dng ton t print.
V cch nhn mt dng t thit b cui l vi ton t
<STDIN>, m (nh ta s dng n y) ly mt dng
ci vo. Gn ci vo ny cho bin $name. iu ny cho
chng trnh:
print Tn bn l g? ;
$name = <STDIN> ;
Gi tr ca $name ti im ny c mt du dng mi
kt thc (Randal c trong Randal\n). vt b iu ,
chng ta dng ton t chop(), ton t ly mt bin v
hng lm i duy nht v b i k t cui t gi tr xu
ca bin:
chop($name);
B sung chn la
By gi ta mun c mt li cho c bit cho
Randal, nhng mun li cho thng thng cho mi
ngi khc. lm iu ny, cn so snh tn c
a vo vi xu Randal, v nu hai xu l mt, th lm
iu g c bit. B sung thm lnh r nhnh if-thenelse v php so snh vo chng trnh:
#!/usr/bin/perl
print Tn bn l g? ;
$name = <STDIN> ;
chop($name);
if ($name eq Randal) {
print Xin cho Randal! Tt qu anh li y!\n;
} else
{
print Xin cho, $name!\n; # cho mng thng
thng
}
12
13
chop($guess);
}
}
15
16
Ngi
T b mt
Fred
camel
Barney
llama
Betty
oyster
Wilma
oyster
18
Gi s ti mun tm bt k xu no bt u vi
Randal, thay v ch l mt xu bng Randal. Ti c th
lm iu ny trong sed hay awk hoc grep vi mt biu
thc chnh qui: mt khun mu s xc nh ra mt tp
hp cc xu snh ng. Ging nh trong sed hay grep,
biu thc chnh qui trong Perl snh bt k xu no bt
u vi Randal l ^Randal. snh xu ny vi xu trong
$name, chng ta dng ton t snh nh sau:
if ($name =~ /^Randal/) {
## c, snh ng
} else {
## khng, snh sai
}
20
23
danh sch.
nh dng c chn bt k cho danh sch t l mt
khon mc trn mt dng, vi tn v t, lun phin. Cho
nn, vi c s d liu hin ti ca chng ta, chng ta c
ci ta nh th ny:
fred
camel
barney
llama
betty
oyster
wilma
oyster
30
31
}
}
## chng trnh con t y xung
sub 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) = @_; # tn tham
bin
$somename =~ s/\W.*//; # b mi th sau t u
$somename =~ tr/A-Z/a-z/; # mi th thnh ch
thng
if ($somename eq randal) { # khng nn on
1; #gi tr cho li l true
} elsif (($words{$somename} || cu knh) eq
$someguess) {
1; # gi tr cho li l true
} else {
0; # cho li gi tr false
}
}
33
close (WORDSLIST);
}
34
35
36
chop($word);
$words{$name} = $word;
}
}
close (WORDSLIST);
}
}
Li undef ln na
37
39
40
Ti im c nh du cht liu mi s a vo
y, cn bit ba iu: tn ca tp (trong $filename), tn
mt ai (trong $name), v rng t b mt ca mt ngi
(trong $Word). Sau y l ch dng cng c sinh bo
co ca Perl. nh ngha mt dng thc u trong
chng trnh (thng thng gn cui, ging nh chng
trnh con):
format STDOUT =
@<<<<<<<<<<<<<<<
@<<<<<<<<<<<<<<
$filename, $name, $word
.
@<<<<<<<<<<
41
@<<<<<<<<<<
42
43
46
47
48
}
}
close (WORDSLIST);
}
}
sub good_word {
local($somename, $someguess) = @_; # tn tham
bin
$somename =~ s/\W.*//; # b mi th sau t u
$somename =~ tr/A-Z/a-z/; # mi th thnh ch
thng
if ($somename eq randal) { # khng nn on
1; #gi tr cho li l true
} elsif (($words{$somename} || cu knh) eq
$someguess) {
1; # gi tr cho li l true
} else {
open(MAIL, |mail a_ch_bn__y);
print MAIL tin xu: $somename on
$someguess\n;
0; # cho li gi tr false
}
}
Tip , c b in t b mt:
#! /usr/bin/perl
while ($filename = <*.secret>) {
open (WORDSLIST, $filename);
if (-M WORDSLIST > 7) {
while ($name = <WORDSLIST>) {
chop ($name);
$word = <WORDSLIST>;
chop($word);
write; # gi dng thc STDOUT cho
STDOUT
}
}
close(WORDSLIST);
49
}
format STDOUT =
@<<<<<<<<<<<<<<<
@<<<<<<<<<<<<<<
$filename, $name, $word
.
@<<<<<<<<<<
format STDOUT_TOP =
Page @<<
$%
Tn tp
Tn
T
========== ======== ==========
.
50
Bi tp
Thng thng, mi chng s kt thc vi mt s
bi tp, li gii cho chng s c trong Ph lc A, Tr li
bi tp. Vi chuyn i do ny, li gii c cho
trn.
1. G chng trnh th d trn vo my ri cho n chy.
(Bn cn to ra danh sch t b mt na.) Hi thy
Perl ca bn nu bn cn tr gip.
51
52
D liu v hng l g?
S
Xu
Ton t
Bin v hng
Ton t trn bin v
hng
<STDIN> xem nh gi
tr v hng
In ra vi print()
Gi tr undef
D liu
v hng
D liu v hng l g?
V hng l loi d liu n gin nht m Perl thao
tc. Mt v hng th hoc l mt s (ging 4 hay
3.25e20) hay mt xu cc k t (ging Xin cho hay
Gettysburg Address). Mc du bn c th ngh v s v
xu nh nhng vt rt khc nhau, Perl dng chng gn
nh i ln cho nhau, cho nn ti s m t chng vi
nhau.
Mt gi tr v hng c th c tc ng bi cc
ton t (ging nh php cng hay ghp tip), ni chung
cho li mt kt qu v hng. Mt gi tr v hng c
th c ct gi vo trong mt bin v hng. Cc v
hng c th c c t tp v thit b, v c ghi ra.
53
S
Mc du v hng hoc l mt s hay mt xu, iu
cng c ch l nhn vo cc s v xu tch bit nhau
trong mt chc. Ta s xt s trc ri n xu...
Tt c cc s c cng dng thc bn trong
Nh bn s thy trong vi on tip y, bn c th
xc nh c s nguyn (ton b s, ging nh 14 hay
342) v s du phy ng (s thc vi du chm thp
phn, nh 3.14, hay 1.35 ln 1025). Nhng bn trong,
Perl ch tnh vi cc gi tr du phy ng chnh xc
gp i. iu ny c ngha l khng c gi tr nguyn
bn trong Perl - mt hng nguyn trong chng trnh
c x l nh gi tr du phy ng tng ng. Bn
c l khng (hay quan tm nhiu) n vic chuyn
i, nhng bn nn dng tm kim php ton nguyn
(xem nh ngc vi cc php ton du phy ng), v
khng c to no.
Hng k hiu ng
Hng k hiu l mt cch biu din mt gi tr
trong vn bn chng trnh Perl - bn cng c th gi
iu ny l mt hng trong chng trnh mnh, nhng ti
s dng thut ng hng k hiu. Hng k hiu l cch
thc biu din d liu trong m chng trnh gc ca
chng trnh bn nh ci vo cho trnh bin dch Perl.
(D liu c c t hay ghi ln cc tp c x l
54
# mt phn t
# 7.25 ln 10 m 45 (mt s ln)
# m 6.5 ln 10 m 24 (mt s m ln)
# m 12 ln 10 m -24 (mt s m rt nh)
# mt cch khc ni iu .
55
Xu
Xu l cc dy k t (nh Xin cho). Mi k t l
mt gi tr 8-bit trong ton b tp 256 k t (khng c g
c bit v k t NUL nh trong C).
Xu ngn nht c th c th khng c k t no.
Xu di nht chim trn b nh ca bn (mc du bn s
chng th no lm g nhiu vi n c). iu ny ph hp
vi nguyn l khng c gii hn sn m Perl cho php
mi c hi. Cc xu in hnh l cc dy in c gm
cc ch v s v du ngt trong phm vi ASCII 32 ti
ASCII 126. Tuy nhin, kh nng c bt k k t no t
0 ti 255 trong mt xu c ngha l bn c th to ra,
qut qua, v thao tc d liu nh phn th nh cc xu mt ci g m phn ln cc trnh tin ch UNIX khc
s gp kh khn ln. (Chng hn, bn c th v vu li
UNIX bng vic c n vo trong xu Perl, tin hnh
thay i, v ghi kt qu li.)
Ging nh s, xu c biu din hng k hiu (cch
thc bn biu din xu trong chng trnh Perl). Cc xu
hng k hiu c theo hai hng v: xu du nhy n v
xu du nhy kp.
Xu du nhy n
Xu du nhy n l mt dy cc k t c bao
trong du nhy n. Du nhy n khng phi l mt
phn ca bn thn xu - chng ch c Perl xc nh
56
ch bt u v kt thc ca xu. Bt k k t no nm
gia cc du nhy (k c du dng mi, nu xu vn cn
tip tc sang dng sau) u l hp php bn trong xu.
Hai ngoi l: ly c mt du nhy n trong mt
xu c nhy n, t trc n mt du s cho ngc.
V ly c du s cho ngc trong mt xu c
nhy n, t trc du s cho ngc mt du s cho
ngc na. Di dng hnh nh:
hello
# nm k t: h, e, l, l, o
dont\t
# nm k t: d, o, n, nhy n, t
# xu khng (khng k t)
silly\\me # silly, theo sau l mt s cho ngc, sau l
me
hello\n
hello
there
57
ngha
dng mi
quay li
tab
ko giy
Xo li
tab chiu ng
Chung
li thot
bt k gi tr ASCII h tm
y, 007 = chung)
gi tr ASCII h mi su
y, 7f = xo)
bt k k t iu khin no
y, control C)
s cho ngc
du nhy kp
ch tip l ch thng
tt c cc ch i sau cho ti
l ch thng
Ch tip l ch hoa
tt c cc ch i sau cho ti
l ch hoa
Kt thc \L hay \U
58
(
(
(
\E
\E
Ton t
Mt ton t to ra mt gi tr mi (kt qu) t mt
hay nhiu gi tr khc (cc ton hng). Chng hn, + l
mt ton t v n nhn hai s (ton hng, nh 5 v 6), v
to ra mt gi tr mi (11, kt qu).
Cc ton t v biu thc ca Perl ni chung l
siu tp ca cc ton t c trong hu ht cc ngn ng
lp trnh ta ALGOL/Pascal, nh C. Mt ton t bao gi
cng trng i cc ton hng s hay xu (hay c th l t
hp ca c hai). Nu bn cung cp mt ton hng xu
ch ang cn ti mt s, hay ngc li, th Perl s t
ng chuyn ton hng bng vic dng cc qui tc
kh trc gic, m s c nu chi tit trong mc
Chuyn i gia s v xu, di y.
Ton t s
Perl cung cp cc ton t cng, tr, nhn, chia in
hnh thng thng, vn vn. Chng hn:
2+3
# 2 cng 3, hay 5
59
5.1 - 2.4
3 * 12
14 / 2
10.2 / 0.3
10 / 3
3.333...
60
Ton t xu
Cc gi tr xu c th c ghp vi ton t chm
(.). (Qu th, l du chm n.) iu ny khng lm
thay i xu, cng nh 2+3 khng lm thay i 2 hay 3.
Xu kt qu (di hn) vy l c sn cho tnh ton thm
hay c ct gi trong mt bin.
hello . world
hello wordl . \n
fred . . barney
# ht nh helloworld
# ht nh hello world\n
# ht nh fred barney
Xu
Bng
==
eq
Khng bng
!=
ne
B hn
<
lt
Ln hn
>
gt
B hn hay bng
<=
le
Ln hn hay bng
>=
ge
Php so snh
61
Ton t
khng
tri
, (phy)
phi
phi
khng
tri
|| (hoc logic)
tri
&& (v logic)
tri
tri
& (v bit)
khng
Lut
kt hp
Ton t
khng
khng
Ton t mt ngi c tn
khng
tri
tri
tri
tri
phi
** (lu tha)
phi
khng
++ -- (t tng, t gim)
65
66
l khc vi
$a_very_long_variable_that_ends_in_2
V tng t nh th:
$b = $b * 3;
$b *= 3;
70
T tng v t gim
Dng cng d dng thm mt vo $a bng
vic ni $a += 1. Perl cn i xa hn v thm ch li cn
lm ngn hn cho iu ny na. Ton t ++ (c gi l
ton t t tng) cng thm mt vo ton hng ca n, v
cho li gi tr c tng, ging nh:
$a += 1 ; # c ton t gn
++$a;
# vi t tng tin t
$d = 17;
$e = ++$d; # $e v $d by gi l 18
Ti y, ton t ++ c dng nh ton t tin t tc l, ton t xut hin bn tri ton hng ca n.
Php t tng cng c th c dng trong dng hu t
(nm bn phi ton hng ca n). Trong trng hp
ny, kt qu ca biu thc ny l gi tr ca bin trc
khi bin c tng ln. Chng hn,
$c = 17;
$d = $c++; # $d l 17, nhng $c by gi l 18
71
Lu rng gi tr ca i b thay i y, do
cn phi c mt bin v hng, thay v ch n gin l
gi tr v hng. S l v ngha, chng hn, vit
chop(suey) bin n thnh sue, v khng c ch no
ct gi gi tr ny. Bn cnh , bn c th ch vit
sue cng .
Ton t ny trng ging nh mt li gi hm, v
qu thc cho li mt gi tr (m bn s trng i nu bn
quen thuc vi li gi hm t cc ngn ng). Gi tr
c cho li chnh l k t b loi b (ch i trong
ngi trn). iu ny c ngha l on m sau y c
l sai:
$x = chop($x); # SAI: thay th $x bng k t cui cng
ca n
chop($x); # ng: nh trn, loi b k t cui
73
$fred
$barney2 = a test of \$fred; # cng nh vy
# nhn vn bn
# g b du dng mi kh chu
75
77
Bi tp
Xem Ph lc A v li gii.
1. Vit chng trnh tnh chu vi ng trn vi bn
knh 12.5. Chu vi bng 2 ln bn knh, hay khong
2 ln 3.141592654.
2. Sa chng trnh t bi tp trc nhc vic nhn
bn knh t ngi chy chng trnh.
3. Vit mt chng trnh nhc v c vo hai s, ri in
ra kt qu ca vic nhn hai s .
4. Vit mt chng trnh c mt xu v mt s ri in
ra xu s ln c ch ra bi s cc dng tch bit.
(Hng dn: dng ton t x.)
78
3
D liu mng
v danh sch
Mng l g?
Mng l mt danh sch c th t cc d liu v
hng. Mi phn t ca mng l mt bin v hng
tch bit vi mt gi tr v hng c lp. Cc gi tr
ny l c sp th t - tc l chng c mt trnh t c
bit t phn t thp nht n cao nht.
Mng c th c bt k s phn t no. Mng nh
nht khng c phn t no, trong khi mng ln nht th
c th lp kn ton b b nh c sn. Mt ln na, iu
ny li c gi hp vi trit l ca Perl v khng c
gii hn khng cn thit no.
79
Cc phn t ca mng khng nht thit l hng chng c th l biu thc m s c tnh mi li mi
ln hng c s dng. Chng hn:
($a, 17)
# hai gi tr: gi tr hin ti ca $a, v 17
($b+$c,$d+$e)
# hai gi tr
Nu mt gi tr v hng c gn vo trong mt
bin mng th gi tr v hng tr thnh phn t duy
nht ca mng:
@huh = 1; # 1 c t cho danh sch (1) mt cch t
ng
*
82
Perl 5.0 cho php mt tham chiu danh sch l mt phn t danh
sch, nhng y vn khng phi l danh sch nh mt phn t danh
sch
83
84
85
Cc gi tr ch s trong nhng th d ny l cc s
86
87
88
Ch rng i th nht phi l mt tn bin mng* y vo v ly ra s khng c ngha vi danh sch hng
k hiu.
Cc ton t shift() v unshift()
Cc ton t push() v pop() lm mi iu bn
phi ca danh sch (phn vi ch s cao nht). Tng
t th, cc ton t unshift() v shift() thc hin nhng hnh
ng tng ng v bn tri ca mt danh sch (phn
vi ch s thp nht). Sau y l vi 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;
# vi mt s gi tr thc
@fred = (5,6,7);
unshift(@fred,2,3,4); # @fred by gi l (2,3,4,5,6,7)
$x = shift(@fred); # $x nhn 2, $fred nhn by gi l
(3,4,5,6,7)
89
@b = reverse(@a); # t $b gi tr (9,8,7)
$b = reverse(7,8,9); # cng vic y
Ton t sort()
Ton t sort() ly i ca n v sp xp chng dng
nh chng tt c l cc xu theo trt t ASCII tng
dn. N cho li danh sch sp xp, khng lm thay
i danh sch gc. Chng hn:
@x = sort(small, medium, large);
# @x nhn large, medium, small
@y = (1,2,4,8,16,32,64);
@y = sort(@y); # @y nhn 1, 16, 2, 32, 4, 64, 8
91
@a = (x,y,z);
print (Ti thy , @a, phn t\n); # sai, s in l xyz
cho @a
print (Ti thy ,.@a, phn tt\n); # ng, in 3 cho
@a
Bi tp
Xem Ph lc A v li gii
1. Vit mt chng trnh c mt danh sch cc xu v
in ra danh sch theo th t o ngc.
2. Vit mt chng trnh c mt s ri mt danh sch
cc xu (tt c trn cc dng tch bit), ri in mt
trong cc dng t danh sch nh c la chn
bi con s .
3. Vit mt chng trnh c mt danh sch cc xu ri
cn ra v in xu ngu nhin trong danh sch .
Chn mt phn t ngu nhin ca @somearray , t
srand;
94
95
96
Khi cu lnh
Cu lnh if /
unless
Cu lnh while /
until
Cu lnh for
Cu lnh
foreach
4
Cu trc
iu khin
Khi cu lnh
Khi cu lnh l mt dy cc cu lnh, c bao
trong cp du ngoc nhn. N trng ta nh th ny:
{
cu lnh th nht;
cu lnh th hai;
cu lnh th ba;
...
cu lnh cui;
}
nhn mi v tr ca mt cu lnh.
Cu lnh if/unless
phc tp tip theo trong cc cu lnh l cu lnh
if. Kt cu ny trng rt ging kt cu trong C: mt biu
thc iu khin (c tnh theo tnh ng n ca n),
v hai khi. Ni cch khc, n trng ta nh th ny:
if (biu thc no ) {
cu lnh 1 trong trng hp ng ;
cu lnh 2 trong trng hp ng ;
cu lnh 3 trong trng hp ng ;
} else {
cu lnh 1 trong trng hp sai ;
cu lnh 2 trong trng hp sai ;
cu lnh 3 trong trng hp sai ;
}
98
99
100
Cu lnh for
Mt kt cu lp khc ca Perl l cu lnh for, trng
ging nh cu lnh for ca C, v lm vic th i th
cng ging th. Sau y l n:
for (biu thc khi u; biu thc kim tra; biu thc
tng) {
cu lnh 1;
cu lnh 2;
cu lnh 3;
}
104
print $b;
}
@a = (3,5,7,9);
foreach $one ($a) {
$one *= 3;
}
# @a by gi l (9, 15,21,27)
Bi tp
Xem Ph lc A v li gii.
1. Vit mt chng trnh hi v nhit bn ngoi, ri
in qu nng nu nhit l trn 72 F, v qu
lnh trong cc trng hp khc.
2. Sa i chng trnh trong bi tp trc cho n in
ra qu nng nu nhit l trn 75F, qu lnh
nu nhit l di 68F, v va phi nu nhit
trong khong 68 v 75.
3. Vit mt chng trnh c mt danh sch cc s
(mi s mt hng) cho ti khi c ti s 999, ri in
ra ton b tt c cc s cng li vi nhau. (Phi
chc ng c cng c 999 vo!) Chng hn, nu bn
a vo 1,2,3 v 999 th chng trnh s p ng vi
cu tr li 6 (1+2+3).
4. Vit mt chng trnh c mt danh sch cc xu ri
in chng ra thnh danh sch cc xu theo th t o
ngc (khng dng ton t reverse cho danh sch).
(Nh rng ton t <STDIN> s c mt danh sch cc
xu trn tng dng tch bit khi c dng trong
hon cnh mng.)
106
s in ra $a v $b nh mt s c nm ct, cn $b nh
mt s c tm ct.
107
108
Mng kt hp l g?
Bin mng kt hp
Biu din hng cho
mng kt hp
Cc ton t mng kt
hp
Mng kt hp
Mng kt hp l g?
Mng kt hp cng ta nh mng (kiu danh sch)
tho lun trc y, trong n l mt tuyn tp cc
d liu v hng, vi cc phn t ring c chn ra
bng mt gi tr ch s no . Khng ging mng danh
sch, gi tr ch s ca mng kt hp khng phi l s
nguyn khng m nh, m thay vo l v hng tu
. Nhng v hng ny (cn gi l kho) c dng v
sau tm kim cc gi tr t mng ny.
Cc phn t ca mng kt hp khng c th t c
bit. Xem chng ta nh bn y nhng qun bi. Na
trn ca cc con bi l kho, cn na di l gi tr ca
chng. Mi ln bn t mt gi tr vo trong mng kt
hp th mt con bi mi li c to ra. V sau khi bn
109
110
Cc ton t mng kt hp
Sau y l mt s ton t cho mng kt hp.
Ton t keys()
Ton t keys(%tn mng) cho li danh sch cc tt
c cc kho hin c trong mng kt hp %tn mng . Ni
cch khc, n ta nh cc phn t c nh s l (mt,
ba nm vn vn) ca danh sch c vic tho ri %tn
mng cho li trong ng cnh mng, v thc ra, cho li
chng theo trt t . Nu khng c phn t no trong
mng kt hp th keys() cho li mt danh sch rng.
Chng hn, bng vic dng mng kt hp t th d
trc:
$fred{aaa} = bbb;
$fred{234.5} = 456.7;
@list = keys(%fred) ; # @list nhn c (aaa, 234.5)
hay (234.5,
aaa)
112
Ton t values()
Ton t values(%tn mng) cho li mt danh sch
tt c cc gi tr hin ti ca %tn mng, theo cng trt
t nh cc kho c ton t keys(%tn mng) cho li.
Nh vi keys(), cc du ngoc trn l tu chn. Chng
hn:
%lastname = (); # buc %lastname l rng
$lastname(fred} = flintstore;
$lastname{barney} = rubble;
@lastname = values(%lastname); # ly cc gi tr
113
Ton t each()
Nu bn mun lp trn (tc l xem xt mi phn t
ca) ton b mng kt hp, bn c th dng keys(), duyt
xt tng kho c cho li v nhn gi tr tng ng.
Trong khi phng php ny thng hay c dng, mt
cch hiu qu hn l dng each(%tn mng), ton t s
cho li cp kho-gi tr nh mt danh sch hai phn t.
Vi mi ln thc hin ton t ny cho cng mng, cp
kho-gi tr k tip s c cho li, cho ti khi tt c cc
phn t c truy nhp ti. Khi khng cn cp no
na th each() cho limt danh sch rng.
Vy chng hn, i qua mng %lastname trong th
d trc, lm iu g ta nh th ny:
while (($first, $last) = each(%lastname)) {
print Tn cui cng ca $first l $last\n;
}
Bi tp
Xem ph lc A v li gii.
1. Vit mt chng trnh c v in mt xu v gi tr
nh x ca n tng ng vi nh x c trnh by
trong bng sau:
Ci vo
lc
xanh
Ci ra
to
l
i dng
115
116
Vo t STDIN
Vo t ton t
Diamond
a ra STDOUT
Vo / ra c bn
Vo t STDIN
Vic c t li vo chun (qua b iu khin Perl
c gi l STDIN) th tht d dng. Chng lm vic
ny vi ton t <STDIN>. Vic tnh ton t ny trong ng
cnh v hng cho bn mt dng tip ca ci vo, hay
undef nu khng cn dng no na, ging nh:
$a = <STDIN>; # c dng tip
117
118
v nu bn gi kitty vi:
kitty file1 file2 file3
a ra STDOUT
Perl dng cc ton t print v printf ghi ln li ra
chun. Xem cch chng c dng.
Dng print cho a ra thng thng
Chng ta dng print hin th vn bn ln li ra
chun. M rng thm mt cht.
Ton t print nhn mt danh sch cc xu, v gi ln
lt tng xu ra li ra chun, khng can thip hay thm
cc k t vo ui. iu c th khng hin nhin l ch
print thc s ch l ton t danh sch, v cho li mt gi
tr ging nh bt k ton t danh sch no khc. Ni cch
*
Th vin chun ca Perl cha cc trnh cho vic phn tch kiu nh
getop cho cc i dng lnh ca chng trnh Perl. Xam Sch con
la bit thm thng tin v th vic ny.
120
khc:
$a = print (xin cho, mi ngi, \n) ;
s in ra $s trong mt trng 15 k t, ri n du
121
Bi tp
Xem Ph lc A v li gii.
1. Vit mt chng trnh hnh ng nh cat, nhng o
ngc th t cc dng. (Mt s h thng c tin ch
kiu nh vy mang tn tac.)
2. Vit mt chng trnh c mt danh sch cc xu ri
in ra xu trong mt ct c cn l phi 20 k t. Chng
hn, a vo xin cho, tm bit in ra xin cho v tm
bit c cn l phi trong ct 20 k t.
3. Sa i chng trnh ca bi tp trc cho php
ngi dng chn ly chiu rng ct. Chng hn, a
vo 20, xin cho v tm bit cng lm cng vic nh
chng trnh trc lm, nhng a vo 30, xin
cho v tm bit th phi cn l xin cho v tm bit
theo ct 30 k t.
122
Biu thc
chnh qui
dng vn bn no , v c in ra nu dng ny c
cha cc k t abc u bn trong dng - tng t nh
ch lnh grep trn. Khng ging nh ch lnh grep, vn
hnh trn tt c cc dng ca tp, on chng trnh Perl
ny ch nhn vo c mt dng thi. lm vic trn tt
c cc dng, cn thm vo mt chu trnh, nh trong:
while (<>) {
if (/abc/) {
print $_;
}
}
iu g s xy ra nu nh khng bit c s ca
cc b gia a v c? Tc l, iu g s xy ra nu mun in
dng c cha mt a v theo sau n l khng hay nhiu b,
ri theo sau na l mt c? Vi grep, phi ni:
grep ab*c somefile > result
Khun mu
Mt biu thc chnh qui l mt khun mu. Mt s
phn ca khun mu snh ng ch cc k t trong xu
thuc kiu c bit. Nhng phn khc ca khun mu
snh ng cho a k t, hay a a k t. Trc ht, s
xem cc khun mu mt k t, ri n cc khun mu a
k t.
126
Khun mu mt k t
K t snh mu n gin nht v thng dng nht
trong cc biu thc chnh qui l mt k t snh vi chnh
n. Ni cch khc, t mt ch a vo trong biu thc
chnh qui i hi mt ch tng ng a trong xu.
K t snh mu thng dng nht tip l du chm
.. Du chm i snh bt k k t ring l no ngoi tr
du dng mi (\n). Chng hn, khun mu /a./ i snh
bt k dy hai k t no bt u bng a v khng phi l
a\n.
Lp k t snh mu c biu din bi cp du
ngoc vung m v ng, v mt danh sch cc k t
nm gia hai du ngoc ny. Mt v ch mt trong cc k
t ny phi hin din ti phn tng ng ca xu cn
snh mu. Chng hn,
/[abcde]/
127
[0-9] # cng th
[0-9\-] # snh 0-9 hay du tr
[a-z0-9] # snh bt k ch thng hay s no
[a-zA-Z0-9_] # snh bt k ch, s hay du gch thp
Lp tng
ng
Kt cu
ph nh
Lp ph
nh tng
ng
\d (s)
[0-9]
\D (s,
khng!)
[^0-9]
\w (t)
[a-zA-Z09_]
\W (t,
khng!)
[^a-zA-Z09_]
\s (cch)
[ \r\t\n\f]
\S (cch,
khng!)
[^ \r\t\n\f]
vi k t t, mc du iu thc s snh ng l bt k
ci g hp l trong tn bin Perl. Khun mu \s snh vi
du cch (khong trng), y c xc nh nh du
cch, v u dng (khng hay dng my trong UNIX),
tab, xung dng (du dng mi ca UNIX), v ko giy.
Cc bn ch hoa snh ng vi ci i lp cho nhng
lp ny.
Khun mu nhm
Sc mnh thc s ca biu thc chnh qui l khi bn
c th ni mt hay nhiu nhng th ny hay cho ti
nm th ny. Ta ni v cch thc hin iu ny.
Dy
132
133
Thay phin
Mt kt cu nhm khc l thay phin, nh trong
a|b|c. iu ny c ngha l snh ng mt trong cc kh
nng (a hay b hay c trong trng hp ny). iu ny vn
c tc dng ngay c khi cc thay phin c nhiu k t,
nh trong /song|blue/, s snh hoc song hoc blue. (Vi
nhng thay phin n gin, tt hn c l bn c th b
lp k t nh /[abc]/.)
iu g xy ra nu mun snh songbird hay bluebird?
c th vit /songbird|bluebird/, nhng phn bird khng
nn c hai ln. Thc ra, cng c cch ra, nhng phi
ni ti th t u tin cho cc khun mu nhm, s c
cp ti trong mc Th t u tin di y.
Khun mu neo
Bn k php c bit ng neo cho mt khun mu.
Thng thng, khi mt khun mu c snh vi xu th
s bt u ca khun mu c r i trong ton b
xu t tri sang phi, snh vi c hi c th u tin.
Neo cng cho php bn m bo rng cc phn ca dng
khun mu sp thng vi nhng phn c bit ca xu.
Cp neo th nht i hi rng mt phn c bit ca
vic i snh phi c nh v ti bin gii t hay
khng ti bin gii t. Neo \b yu cu mt bin gii t
ti im ch ra cho khun mu i snh. Bin gii t
l ni gia cc k t snh vi \w v \W, hay gia cc k
t snh vi \w v ch bt u hay kt thc ca xu. Ch
rng iu ny t phi x l i vi ting Anh v phi
lm nhiu i vi cc k hiu C, nhng iu cng gn
134
135
Th t u tin
Vy iu g xy ra khi ly a|b* cng nhau? Liu y
l a hay b mt s ln bt k hay ch mt a hay nhiu b?
c ri, cng ging nh cc ton t c s u tin,
cc khun mu b neo v gp nhm cng c s u tin.
S u tin ca khun mu t cao xung thp nht c
cho trong Bng 7-2.
Bng 7-2: S u tin ton t gp nhm biu thc
chnh qui (cao nht xung thp nht)
Tn
Biu din
Du ngoc trn
()
S bi
+ * ? {m,n}
Tun t v b neo
abc^$\b\B
Thay phin
137
$a =~ /^he/; # ng
$a =~ /(.)\l/; # cng ng (snh vi hai l)
if ($a =~ /(.)\1/) { # ng, cho nn c ...
# mt s cht liu khc
}
140
Nu bn a vo bird, th n c tm ra. Nu bn
a vo scream n s khng tm thy. Nu bn a vo
[bw]ird, iu y cng c tm ra, ch ra rng cc k t i
snh khun mu biu thc chnh qui qu thc l vn c
ngha. Ti s ch ra cho bn trong phn Thay th di
y v cch thay i xu cho cc k t i snh khun
mu chnh qui c tt i.
Bin ch c c bit
Sau khi i snh khun mu thnh cng, cc bin
$1, $2, $3 vn vn s c t cho cng gi tr l \1, \2,
\3 vn vn. Bn c th dng iu ny nhn vo mt
phn ca vic i snh trong on chng trnh sau.
Chng hn:
$_ = y l php kim tra;
/(\W+)\W+(\W+)/; # i snh hai t u
# $1 by gi l y cn $2 by gi l l
Thay th
Chng ta ni v dng n gin nht ca ton t
thay th: s/old-regex/new-string/. By gi l lc ni ti vi
bin th ca ton t ny.
Nu bn mun vic thay th vn hnh trn tt c cc
i snh c th thay v ch vic i snh u tin th vit
142
thay
fred
bng
barney,
143
ging
144
merlyn::118:10:Randal:/home/merlyn:/usr/bin/perl;
@fields = split(/:/,$line); # cht $line ra, dng : lm du
nh bin
# by gi @field l (merlyn, , 118, 10, Randal,
#
/home/merlyn,/usr/bin/perl)
145
Bi tp
Xem Ph lc A v li gii.
1. Xy dng mt biu thc chnh qui snh cho:
(a) t nht mt a theo sau bi mt s bt k b
(b) mt s bt k du s cho ngc theo sau bi mt
s bt k du sao
146
148
Cc hm h
thng v ngi
dng
nh ngha mt
hm ngi dng
Cho li gi tr
i
Bin cc b
trong hm
Hm
149
}
subname l tn ca chng trnh con, l bt k tn
no ging nh tn t cho bin v hng, mng v
mng kt hp. Mt ln na, nhng tn ny li n t mt
khng gian tn khc, cho nn bn c th c mt bin v
hng $fred, mt mng @fred, mt mng kt hp %fred,
v by gi mt trnh con fred.
151
Gi tr cho li
Ging nh trong C, mt trnh con bao gi cng l
mt phn ca mt biu thc no (khng c ci tng
ng trong li gi th tc ta Pascal). Gi tr ca vic
gi trnh con c gi l gi tr cho li. Gi tr cho li
ca mt trnh con l gi tr ca biu thc cui cng c
tnh bn trong thn ca trnh con cho mi ln gi.
Chng hn, nh ngha trnh con ny:
sub sum_of_a_and_b {
$a + $b;
}
sub gime_a_or_b {
if ($a > 0) {
print chn a ($a)\n;
$a;
} else {
print chn b ($b)\n;
$b;
}
}
153
155
157
(15,30)
bng
local ($n, @values) = @_ ;
158
Bi tp
1. Vit mt trnh con nhn mt gi tr s t 1 ti 9 v
cho li tn ting Anh (nh mt, hai, hay chn). Nu
gi tr a vo ngoi phm vi ny, th cho li s
ban u thay v cho tn. Th n vi mt s d liu
vo - c l bn s phi vit ra mt loi khin trnh
no .
2. Ly chng trnh trong bi tp trc, vit mt
chng trnh nhn hai s v cng chng li, hin th
kt qu kiu hai cng hai l bn. (Ch qun vit
hoa t u!)
3. M rng trnh con ny cho li m chn qua m
mt v khng. Th chng trnh ny.
159
160
Ton t last
Ton t next
Ton t redo
Khi c nhn
B thay i biu
thc
&&, || v ?: xem
nh cc cu trc
iu khin
Cc cu trc
iu khin khc
Ton t last
Trong mt s bi tp trc y bn c th ngh,
Nu ti c c mt cu lnh break ca C y, th
xong ri. Cho d bn khng ngh nh th, th hy c
ti ni cho bn v s tng ng ca Perl thot sm
khi chu trnh : ton t last.
Ton t last ngt khi chu trnh bao quanh bn
trong nht, gy ra vic thc hin tip tc vi cu lnh i
ngay sau khi . Chng hn:
while (ci g ) {
ci g ;
ci g ;
ci g ;
161
if (iu kin no ) {
ci g khc ;
ci g khc ;
last ; # nhy ra khi chu trnh while
}
thm na ;
thm na ;
}
# last nhy ti y
Ti c th lm iu nh th ny:
while (<STDIN>) { # c dng vo
if (/^From:/) { #c bt u vi From: khng? Nu c...
if (/merlyn/) { # n l t ti!
print Email from Randal! Its about
time!\n;
}
last ; # khng cn tm From: na, cho nn ra
} # kt thc if from:
if (/^$/) { # dng trng ?
last ; # nu ng, ng kim tra thm na
}
} # kt thc while
163
phn th nht ;
if (iu kin no ) {
phn no ;
phn no ;
next ; # nhy ra khi chu trnh while
}
phn khc ;
phn khc ;
# next ti y
}
164
166
print $i ln $j l 63!\n ;
last OUTER;
}
if ($j >= $i) {
next OUTER ;
}
}
}
Tp hp cc cu lnh ny th tt c cc gi tr k
tip ca hai s nh nht c nhn vi nhau cho ti khi
n tm ra mt cp c tch l 63 (7 v 9). Lu rng mt
khi tm c mt cp th khng cn phi kim tra cc
s khc na, cho nn cu lnh if th nht ra khi c hai
chu trnh for bng vic dng last vi nhn. Cu lnh if th
hai c gng m bo rng s ln hn trong hai s bao
gi cng l s th nht bng vic b qua vic lp tip
ca chu trnh bn ngoi ngay khi iu kin ny khng
cn xy ra na. iu ny c ngha l cc s s c
kim th vi ($i, $j) l (1,1), (2,1), (2,2), (3,1), (3,2),
(3,3), (4,1) vn vn.
Cho d khi bn trong nht c gn nhn, th cc
ton t last, next, v redo khng c tham bin tu chn
(nhn) vn vn hnh tn trng khi bn trong nht. Cng
vy, bn khng th dng nhn nhy vo trong mt
khi - ch nhy ra khi. Cc ton t last, next hay redo
phi bn trong khi.
B thay i biu thc
Xem nh mt cch khc ch ra nu th ny, th
th kia, Perl cho php bn gn nhn cho mt b sa i
if ln mt biu thc vn l mt biu thc ng ring.
167
Kiu nh:
biu thc no if biu thc iu khin ;
ca hai s ln hn mt s cho:
chop ($n = <STDIN>) ;
$i = 1; # khi u
$i *= 2 until $i > $n ; # lp cho ti khi tm ra n.
bng
ci ny || ci n ;
Bi tp
1. M rng bi ton ca chng trc lp li php
ton cho ti khi t end c a vo cho mt
trong cc gi tr. (Hng dn: dng mt chu trnh v
hn, v ri thc hin last nu gi tr a vo l end.)
171
172
Tc hiu tp l
g?
M v ng tc
hiu tp
die()
Dng tc hiu
Kim th tp -x
Cc ton t stat()
v lstat()
Dng tc hiu
tp
10
Tc hiu tp
v kim th tp
Tc hiu tp l g?
Tc hiu tp l tn trong mt chng trnh Perl
dnh cho vic ni gia tin trnh Perl ca bn v th gii
bn ngoi. Chng ta thy v dng tc hiu tp mt
cch khng tng minh: STDIN l mt tc hiu tp, t
tn cho vic ni gia tin trnh Perl v li vo chun ca
UNIX. Ging nh vy, Perl cung cp STDOUT (cho li
ra chun) v STDERR (cho li ra chun cho li). Nhng
tn ny l trng vi cc tn c dng trong b trnh th
vin vo/ra chun ca UNIX, Perl dng chng cho hu
173
ht vic vo/ra.
Tn tc hiu tp cng ging nh tn dnh cho cc
khi c nhn, nhng chng n t mt khng gian tn
khc (cho nn bn c th c mt v hng $fred, mt
mng @fred, mt mng kt hp %fred, mt chng trnh
con &fred, mt nhn fred, v by gi mt tc hiu tp
fred). Ging nh nhn khi, tc hiu tp c dng
khng cn mt k t c bit ng trc, v do vy c
th b ln ln vi cc t dnh ring hin c hay trong
tng lai. Mt ln na, khuyn co ca Larry l dng
TT C CC CH HOA trong tc hiu tp ca mnh
- khng ch n biu th tt hn, m n cng s m bo
rng chng trnh ca bn s khng hng khi cc t
dnh ring tng lai c a vo.
M v ng mt tc hiu tp
Perl cung cp ba tc hiu tp, STDIN, STDOUT,
STDERR, t ng m cho cc tp hay thit b do tin
trnh cha m ca chng trnh ny thit lp (c th l
lp v). Bn dng ton t open() m cc tc hiu tp
ph, ht nh bn lm trong chng trnh c vit trong
C. C php ca n ging th ny:
open (FILEHANDLE, tn no );
176
/tmp/dataplace\n;
th khng in ra tn tp v s dng.
Dng tc hiu tp
Mt khi tc hiu tp c m ra c, bn c th
c cc dng t n ht nh bn c th c t li vo
chun vi STDIN. Vy, chng hn, c cc dng t
tp mt hiu:
open (EP, /etc/passwd);
while (<EP>) {
chop;
print Ti thy $_ trong tp mt hiu!\n;
}
177
Kim tra tp -x
By gi bn bit cch m mt tc hiu tp
ghi ra, vit ln bt k tp hin c no vi cng tn.
Gi s bn mun chc chn rng khng c mt tp no
178
print u? ;
$filename = <STDIN>;
chop($filename); # qung ci du dng mi kh chu i
if (-r $filename && -w $filename) {
# tp c, v ti c th c v ghi n
...
179
-W
-X
-O
-e
-z
ngha
Tp hay danh mc c c
Tp hay danh mc ghi c
Tp hay danh mc thc hin c
Tp hay danh mc do ngi dng s
hu
Tp hay danh mc c c bi
ngi dng thc, khng phi ngi
dng hiu qu (khc -r vi chng
trnh setuid)
Tp hay danh mc ghi c bi ngi
dng thc, khng phi ngi dng
hiu qu (khc vi -w cho chng
trnh setuid)
Tp hay danh mc thc hin c bi
ngi dng thc, khng phi ngi
dng hiu qu (khc vi -x cho
chng trnh setuid)
Tp hay danh mc c s hu bi
ngi dng thc, khng phi ngi
dng hiu qu (khc vi -o cho
chng trnh setuid)
Tp hay danh mc c
Tp c v c kch thc khng
180
Kim
tra tp
-s
-f
-d
-l
-S
-p
-b
-c
-u
-g
-k
-t
-T
-B
-M
-A
-C
ngha
(danh mc th khng bao gi rng)
Tp hay danh mc c v c kch
thc khc khng (gi tr c tnh
theo byte)
Khon mc l tp r
Khon mc l danh mc
Khon mc l symlink
Khon mc l ch cm
Khon mc l ng ng c tn (mt
fifo)
Khon mc l tp khi c bit (ging
nh a tho lp c)
Khon mc l tp k t c bit (nh
thit b vo/ra)
Tp hay danh mc l setuid
Tp hay danh mc l setgid
Tp hay danh mc c tp bit dnh
isatty() trn tc hiu tp l ng
Tp l vn bn
Tp l nh phn
sa tui theo ngy
Tui truy nhp theo ngy
Tui thay i inode theo ngy
182
c c, th ch cn n gin l:
foreach (@some_list_of_filenames) {
print $_ l c c\n if -r; # cng nh -r $_
}
Cc tn y tr ti cc b phn ca cu trc
stat, c m t chi tit trong stat(2) ca bn. C l bn
nn nhn vo xem cc m t chi tit.
Chng hn ly ID (s hiu) ngi dng v ID
nhm ca tp mt hiu, th:
($uid,$gid) = (stat (/etc/passwd)) [4, 5];
V l cch lm.
183
Dng _Filehandle
Mi ln bn ni stat(), -r, -w hay bt k ci g trong
chng trnh, Perl phi tr ra h thng hi b m
stat trn tp (b m cho li t li gi h thng stat).
iu c ngha l nu bn mun bit liu tp c va
c c v ghi c khng, bn v bn cht hi h
thng hai ln cho cng mt thng tin (iu ny khng
th thay i c trong mt mi trng kh khng thn
thin)
iu ny c v nh lng ph, v thc ra, c th trnh
c. Thc hin vic kim tra tp, stat, hay lstat trn
_filehandle (mt du gch thp) xem nh ton hng s
bo cho Perl dng bt k ci g ngu nhin c trong b
nh t ln kim tra tp trc . i khi iu ny l
nguy him: mt chng trnh con c th gi stat mt
cch khng ch nh, nm tiu b m ca bn i.
Nhng nu bn cn thn, bn c th tit kim mt vi li
184
Bi tp
Xem ph lc A v li gii.
1. Vit mt chng trnh c vo mt tn tp t
STDIN, ri m tp v hin th ni dung ca n c
ng trc bi tn tp v mt du hai chm. Chng
hn, nu fred c c vo, v tp fred bao gm ba
dng aaa, bbb v ccc, bn s thy fred: aaa, fred: bbb
v fred: ccc.
185
186
Dng thc l g?
Gi mt dng
thc
Ni thm v
Fieldholder
Dng thc u
trang
i mc nh cho
dng thc
11
Dng thc
Dng thc l g?
Trong s nhiu vic lm c, Perl thng c
dng lm ngn ng trch rt v bo co thc hnh.
y l lc bit v vic ngn ng bo co .
Perl cung cp mt khi nim v khun mu vit bo
co n gin, c gi l dng thc. Dng thc xc nh
ra phn khng i (tiu ct, nhn, vn bn c nh
hay bt k ci g) v phn bin i (d liu hin ti m
bn bo co). Hnh dng ca dng thc, rt gn vi hnh
dng ca ci ra, tng t nh ci ra c dng thc
trong COBL hay mnh print using ca mt s ngn
ng BASIC.
Vic dng dng thc bao gm ba iu sau:
1. nh ngha dng thc
187
thc ca bn c l s l mt nh tn tc hiu tp (m
th, lm cho chng khng phi l mt nh cc t dnh
ring)
Tip theo sau dng th nht l bn thn khun mu,
m rng t khng n nhiu dng vn bn. Phn cui
ca khun mu c ch ra bng mt du chm. Khun
mu l nhy cm vi khong trng - y l mt trong vi
ch m mt s khong trng (du cch, xung dng, hay
tab) gy ra vn trong vn bn chng trnh Perl.
nh ngha khun mu c cha mt chui cc dng
trng. Mi dng trng c th cha vn bn c nh vn bn s c in ra theo tng k t khi dng thc ny
c gi ti. Sau y l mt th d v dng trng c
vn bn c nh:
Hello, my name is Fred Flintstone.
Ni gi trng l @<<<<<<<<<<<, s xc nh ra
trng vn bn c dn tri bi 11 k t. Cc chi tit
y hn v ni gi trng s c nu trong mc c
tn Ni thm v ni gi trng di y.
189
Gn tt c nhng iu ny li chng ta c th to ra
mt dng thc n gin cho mt nhn a ch:
format ADDRESSLABEL =
========================
| @<<<<<<<<<<<<<<<<<<<< |
$name
| @<<<<<<<<<<<<<<<<<<<< |
$address
| @<<<<<<<<<<<, @< @<<<< |
$city,
$state, $zip
========================
.
191
========================
| @<<<<<<<<<<<<<<<<<<<< |
$name
| @<<<<<<<<<<<<<<<<<<<< |
$address
| @<<<<<<<<<<<, @< @<<<< |
$city,
$state, $zip
========================
.
open (ADDRESSLABEL, >labels-to-print) || die cant
create;
open (ADDRESSLABEL, addresses) || die can not
open addresses;
while ( <ADDRESSES> ) {
chop; # remove newline
($name, $address, $city, $state, $zip) = split (/:/) ;
# load up the global variables
write ADDRESSLABEL; # send the output
}
SW
Hall
Suite
107:
Ni thm v ni gi tp
Cho n gi, qua th d, bn bit rng ni gi
trng @<<<< c ngha l mt trng c dn tri vi
nm k t v rng @<<<<<<<<<<< ngha l mt trng
c dn tri vi 11 k t. Sau y l ton b phm vi,
nh ha trc y.
193
Trng vn bn
Phn ln nhng ni gi trng bt u bng @.
Cc k t i sau @ ch ra kiu ca trng, trong khi s
cc k t (k c @) ch ra chiu rng ca trng.
Nu cc k t i sau @ l du m ngoc gc tri
(<<<<), bn nhn c mt trng c dn tri - tc
l, gi tr s c gn thm bn phi bng du cch nu
gi tr ny ngn hn chiu rng trng. (Nu mt gi tr
qu di, n s b cht ct t ng - dng ca dng thc
bao gi cng c bo tn.)
Nu cc k t i sau @ l du ng ngoc gc phi
(>>>>), bn nhn c mt trng c dn phi - tc
l nu gi tr qu ngn, n s c b sung du cch vo
bn tri.
Cui cng, nu cc k t i sau @ l du s ng (| |
| |), bn nhn c mt trng nh tm: nu gi tr qu
ngn, n c b sung thm du cch vo c hai bn,
cho tng bn lm cho gi tr thnh nh tm nht bn
trong trng.
Trng s
Mt loi ni gi trng khc l trng s chnh
xc tnh, c ch cho nhng bo co ti chnh ln. Trng
ny cng bt u vi @, v c theo sau bi mt hay
nhiu du # vi mt du chm tu chn (ch ra du chm
thp phn). Mt ln na, @ li c m nh mt trong
cc k t ca trng. Chng hn:
format MONEY
Assets: @#####.##
Liabilities:
194
@#####.##
Net:
@#####.##
$assets, $liabilities, $assets-$liabilities
.
195
sinh ra ci ra:
Text Before.
Fred
Baney
Betty
Wilma
Text After.
Trng c lp y
Mt loi ni cha trng khc l trng c lp
196
197
$name,
$comment
Comment: ^<<<<<<<<<<<<<<<<<<
$comment
Comment: ^<<<<<<<<<<<<<<<<<<
$comment
Comment: ^<<<<<<<<<<<<<<<<<<
$comment
198
$name,
~
~
~
$comment
Comment: ^<<<<<<<<<<<<<<<<<<
$comment
Comment: ^<<<<<<<<<<<<<<<<<<
$comment
Comment: ^<<<<<<<<<<<<<<<<<<
$comment
.
Chiu di trang mc nh l 60 dng. Bn c th
thay i iu ny bng vic t mt bin c bit, c
m t tm tt.
Perl khng liu bn c dng print in ln cng
tc hiu tp hay khng cho nn n c th nm i s
dng trn trang. Bn c th hoc l vit li chng trnh
ca mnh dng cc dng thc gi i mi th, hay
trnh n bin s dng trn trang hin ti sau khi bn
thc hin lnh print. Cht na chng ta s thy cch thay
i gi tr ny.
y, lm th d, d dng hn nhiu l ch cn t
LOGFILE mt cch tng minh nh mt tc hiu tp
cho print, nhng c mt s thao tc i hi tc hiu tp
hin c la phi thay i, nh s thy ngay sau y.
Thay i tn dng thc
Tn dng thc ngm nh cho mt tc hiu tp l
ging nh tc hiu tp. Tuy nhin, bn c th cthay i
iu ny cho tc hiu tp hin c la bng vic thit
t tn dng thc mi trong mt bin c bit c gi
l $~. Bn c th cng xem xt li gi tr ca bin ny
xem dng thc hin thi l g i vi tc hiu tp hin
203
c la.
Chng hn, dng dng thc ADDRESSLABEL
trn STDOUT, cng d nh:
$_ = ADDRESSLABEL ;
Nhng iu g xy ra nu bn mun t dng thc
cho tc hiu tp REPORT l SUMMARY? Ch cn vi
bc lm iu y:
$oldhandle = select (REPORT) ;
$~ = SUMMARY ;
select ($oldhandle) ;
206
Bi tp
1. Vit mt chng trnh m tp /etc/passwd v in ra
tn ngi dng, (s hiu) ID ngi dng, v tn thc
theo ct c dng thc. Dng format v write.
2. Thm dng thc u trang vo chng trnh trc.
(Nu tp mt hiu cn t, bn c th cn t chiu di
trang thnh s no nh 10 dng chng hn cho
bn c th thu c nhiu th nghim ca u trang.)
3. Thm s trang tng tun t vo u trang, cho bn
thu c trang 1, trang 2 vn vn trn ci ra.
207
208
i quanh cy
danh mc
Globbing
Tc hiu danh
mc
M v ng
tc hiu danh
mc
. c tc hiu
danh mc
12
Truy nhp
danh mc
y l mt th d:
chdir(/etc) || die khng th chuyn sang /etc (k tht!) ;
Bn khng th tm ra c bn u m khng a
ra ch lnh pwd. Chng ta s hc v vic a ra cc ch
lnh trong Chng 14, Qun l tin trnh.
Mi tin trnh UNIX c danh mc ring ca n.
Khi mt tin trnh mi c a ra, n k tha danh mc
hin thi ca cha m, nhng l chm ht mi ghp
ni. Nu chng trnh Perl ca bn i danh mc ca n,
iu y s nh hng ti lp v (hay bt k ci g)
khi ng tin trnh Perl. Ging vy, cc tin trnh m
Perl to ra khng th no nh hng ti danh mc hin
thi ca chng trnh Perl. Cc danh mc hin thi cho
nhng tin trnh mi ny c k tha t danh mc hin
thi ca chng trnh Perl.
Globbing
Lp v thng nhn i dng lnh c du sao ring
bit (*) v chuyn n thnh mt danh sch tt c cc tn
tp trong danh mc hin thi. Vy, khi bn ni rm *, bn
210
Ti y tn tp c cho li bt u vi /etc/host,
cho nn nu bn mun ch phn cui cng ca tn, bn
211
212
@files = <$where/*> ;
213
214
215
hng, c sp xp
print $name\n ; # in ., .., passwd, group vn vn
}
closedir(ETC) ;
L rng cc tn bao gm cc tp bt u vi mt
du chm. iu ny khng ging nh glob vi <*> m
khng cho li cc tn bt u vi mt chm (ging nh
echo * ca lp v ).
Bi tp
1. Vit mt chng trnh thay i danh mc cho mt
v tr c xc nh nh ci vo, ri lit k cc tn
ca cc tp ny theo trnh t abc sau khi thay i
. (ng hin danh sch nu vic i danh mc
khng thnh cng - n gin ch cnh bo cho c
gi.)
2. Sa i chng trnh ny bao qut tt c cc tp,
khng ch nhng tp khng bt u vi du chm.
Th lm iu ny vi c mt glob v mt tc hiu
danh mc.
216
13
Thao tc tp
v danh mc
Loi b tp
Trc y, bn bit cch to ra mt tp t bn
trong Perl bng vic m n lm ci ra thng qua mt
tc hiu tp. By gi, chng ta s gp nguy him hn,
v hc cch loi b mt tp (rt thch hp vi Chng
13, bn c ngh nh vy khng?)
Ton t unlink() ca Perl (c ly theo tn ca li
gi h thng UNIX) s xo i mt tn i vi mt tp
(m c th mang nhiu tn). Khi tn cui cng cho mt
tp b xo i, bn thn tp ny cng s b loi b i. iu
ny ch xc l l iu ch lnh rm thc hin. Bi v
mt tp thng ch c mt tn (tr phi bn to ra mc
ni cng), bn c th ngh n vic loi b mt tn nh
vic loi b tp i vi phn ln cc trng hp. Gi s
217
Nu tp ny khng th no b xo i, kt qu 0 l
sai, cho nn cu lnh print c thc hin. Li mt ln
na, iu ny c th c c mt cch tu nh tho
mc ni tp ny hay cho ti bit v n.
print.
i tn tp
Trong lp v, bn i tn tp bng ch lnh mv. Vi
Perl, cng php ton ny c k hiu bng rename($old,
$new). Sau y l cch thay i tp c tn fred thnh
barney:
rename(fred, barney) || die Khng th i tn fred
thnh barney;
khc.
Trong khi i theo tn mi, li c th chy qua mt
mc ni tng trng khc. Mc ni tng trng ny
thm ch cn cho phn mi hn so vi ng dn phi
theo. Thc ra, mc ni tng trng c th tr ti cc
mc ni tng trng khc, m thng thng c t nht
tm mc mc ni tng trng c php, mc du iu
ny him khi c dng trong thc hnh.
Mc ni cng bo v cho ni dung ca tp khi b
mt (v n vn cn m khi c mt trong cc tn ca
tp). Mc ni tng trng khng th no gi c ni
dung khi b mt. Mt mc ni tng trng c th xuyn
qua cc thit b lu tr hin c trong khi mc ni cng,
li khng th th c. Ch mc ni tng trng mi c
th c lm thnh mt danh mc.
Bn phi c kh nng ghi ln danh mc ni bn
ang to ra ra hoc l mt loi mc ni, cho d bn c
th khng cn phi c kh nng m tp m ang mc ni
ti. Bn phi c kh nng thng k stat cho tp (nh c
th ni bi ls -l filename) to ra mt mc ni cng,
nhng bn khng cn mt truy nhp nh vy xem nh
mt mc ni tng trng.
To ra cc mc ni cng v mm bng Perl
Ch lnh ln ca UNIX to ra mc ni cng. Ch lnh
ln fred bigdumbguy
nn ni v barney nu tt c n tho. Nu mc
ni tng trng khng tn ti hay khng th c c
hay thm ch khng phi l mc ni tng trng,
readlink() cho li undef (sai tt nh), m y l l do ti
sao ti li ang th n y.
Trn h thng khng c mc ni tng trng, c hai
ton t symlink() v readlink() khng c dch, lm
cho chng trnh b b trc khi n c bt u. iu
ny l v khng c s tng ng snh c no cho
mc ni tng trng trn cc h thng khng h tr cho
n. Perl c th che du mt s tnh nng ph thuc h
thng vi bn, nhng mt s tnh nng s d r ra ngay.
y l mt trong chng.
To ra v xo danh mc
C l bn khng th lm c iu ny thm nu
khng bit v ch lnh mkdir ca UNIX, ch lnh to ra
danh mc cha cc tp khc, v cc danh mc khc.
224
Ch lnh rmdir ca UNIX loi b i danh mc rng bn s thy thnh phn Perl tng ng vi cng tn.
Sau y l cch lm cho Fred thnh tht nghip:
rmdir(gravelpit) || die khng th rmdir gravelpit ;
Thay i quyn s hu
Mi tp (hay danh mc, hay li vo thit b, hay bt
k ci g) trong h thng tp c mt ngi ch v mt
nhm. Ngi ch v nhm ca mt tp xc nh ra ai l
ngi c php tin hnh (c, ghi v/hoc thc hin
tp). Ngi ch v nhm ca mt tp c xc nh vo
lc tp c to ra, nhng trong hon cnh no , bn
226
1234 v stoners
228
Bi tp
1. Vit mt chng trnh lm vic ging nh rm, xo i
cc tp c cho nh i dng lnh khi chng trnh
ny c gi ti. (Bn khng cn phi gii quyt bt
k tu chn no ca rm.)
Kim th cn thn chng trnh ny trong mt danh
mc gn rng cho bn khng ngu nhin xo i
mt cht liu c ch! Nh rng i dng lnh th
nht c sn trong mng @ARGV khi chng trnh
bt u.
2. Vit mt chng trnh lm vic ging nh mv, i
tn i dng lnh th nht thnh i dng lnh th
hai. (Bn khng cn gii quyt bt k tu chn no
ca ln, hay nhiu hn hai i dng lnh.)
3. Vit mt chng trnh lm vic ging nh ln, to ra
mt mc ni cng t i dng lnh th nht sang i
dng lnh th hai. (Bn khng cn gii quyt bt k
tu chn no ca ln, hay nhiu hn hai i dng
lnh.)
4. Nu bn c cc mc ni tng trng, thay i
chng trnh trong bi tp trc gii quyt mt
kho tu chn -s
5. Nu bn c mc ni tng trng, vit mt chng
trnh tm tt c cc tp c mc ni tng trng tng
t nh cch ls -l thc hin n (name -> value). To ra
mt s mc ni tng trng trong danh mc hin
thi v kim th n.
229
14
Dng system() v
exec()
Dng trch dn li
Dng tin trn hv
tc hiu tp
Dng fork
Tm tt v php
ton tin trnh
Gi v nhn tn
hiu
Qun l
tin trnh
231
thng:
$oldPATH = $ENV{PATH} ; # ct gi ng dn trc
$ENV{PATH} = /bin:/usr/bin:/usr/ucb ; # buc ng
dn bit
system (grep fred bedrock > output) ; cho chy ch lnh
$ENV{PATH} = $oldPATH ; # khi phc li ng dn
trc
234
sch
tty13
tty1A
tty1F
Sep 1 14:55
Aug 31 07:02
Sep 1 09:22
235
Nu tt c iu ny dng nh kh m vi bn, bn
c l nn nghin cu cc li gi h thng fork v exec
trong sch UNIX truyn thng, v Perl thng ly kh
trc tip li gi h thng UNIX chuyn sang.
Ton t exit() to nn vic i ra tc khc khi tin
trnh Perl hin ti. Bn dng cch ny b chng
trnh Perl t u gia, hay vi ton t fork thc
hin chng trnh Perl no ang tin hnh v ri ra.
Sau y l mt trng hp ca vic loi b mt s tp
trong /tmp trn nn tng dng mt tin trnh Perl ch ra.
unless (fork) {
240
xu nhy
n ngc
ch lnh
open() xem
nh tc
hiu tp cho
ci ra
Ci vo
chun
Ci ra
chun
Li
chun
K tha
t
chng
trnh
K tha
t
chng
trnh
c ni
vi tc
hiu tp
K tha
t
chng
trnh
c ly
nh gi
tr xu
K tha
t
chng
trnh
K tha
t
chng
trnh
K tha
t
chng
trnh
K tha
t
chng
trnh
241
Cn i
khng?
C
Ch vo
lc
close()
Php ton
ch lnh
open() xem
nh tc
hiu tp cho
ci vo
fork, exec,
wait
Ci vo
chun
Ci ra
chun
Li
chun
Cn i
khng?
K tha
t
chng
trnh
c ni
vi tc
hiu tp
K tha
t
chng
trnh
Ch vo
lc
close()
Ngi
dng la
chn
Ngi
dng la
chn
Ngi
dng la
chn
Ngi
dng la
chn
wait,
243
244
$saw_signit = 1 ; # t c
}
Mo y l ch gi tr ca c ny c kim tra
ti nhng im c ch trong khi tnh ton v c dng
ra khi chu trnh khi cha xong, ti y cng gii
quyt mt s hnh ng dn dp. Lu ti cu lnh cui
trong chng trnh trn: t hnh ng DEFAULT khi
phc li hnh ng ngm nh trn mt tn hiu c bit
(SIGINT khc s b chng trnh ny ngay lp tc). Mt
gi tr c ch c bit khc ging th ny l IGNORE, c
ngha l b qua tn hiu ny (nu hnh ng mc nh
khng b qua tn hiu , nh SIGINT). Bn c th lm
mt hnh ng tn hiu IGNORE nu khng cn hnh
ng dn dp no, v bn khng mun kt thc cc php
245
ton sm.
Mt trong nhiu cch tn hiu SIGINT c sinh
ra l bng vic cho ngi dng nhn vo mt k t
ngt chn (nh Delete hay Control-C) trn bn phm.
Nhng mt tin trnh cng c th sinh ra tn hiu
SIGINT trc tip bng vic dng ton t kill. Ton t ny
nhn mt s hiu hay tn tn hiu, v gi tn hiu cho
danh sch cc tin trnh c cho theo tn hiu ny. Cho
nn vic gi mt tn hiu t mt chng trnh i hi
phi xc nh s hiu tin trnh ca cc tin trnh nhn
(s hiu tin trnh c cho li t mt s cc ton t,
nh fork hay vic m mt chng trnh nh mt tc
hiu tp). Gi s bn mun gi mt tn hiu 2 (cng cn
c bit nh SIGINT) cho cc tin trnh c s hiu 234
v 237. n gin hn c l nh th ny:
kill (2, 234, 237) ; # gi SIGINT cho 234 v 237
Bi tp
Xem tr li ph lc A
1. Vit mt chng trnh phn tch ci ra ca ch lnh
date thu c ngy hin ti ca tun. Nu ngy
ca tun l ngy lm vic, in ch lm vic, ngoi ra in
ch i chi.
2. Vit mt chng trnh nhn tt c cc tn thc ca
ngi dng t tp /etc/passwd, ri bin i thnh ci
ra ca ch lnh who, bng vic thay th tn ng nhp
(ct th nht) bi tn tht. (Hng dn: to ra mt
mng kt hp c kho l tn ng nhp v gi tr l
246
247
248
15
Bin i
d liu khc
Tm mt xu con
Tm mt xu con ph thuc vo ni bn mt n. Nu
bn ngu nhin mt n bn trong mt xu ln hn, bn
cn may mn, v index() c th gip bn tm ra. Sau y
l dng v ca n:
$x = index ($string, $substring) ;
250
hai)
$where = index(hello world, o, 8); # cho li -1 (ht sau
8)
index()),
substr(10000000000,
0,
$power+1);
Nu v tr bt u l trc ch m u ca xu
(ging nh mt s m khng l ln hn chiu di ca
xu), ch m u s l v tr bt u (dng nh bn
dng 0 lm v tr bt u). Nu v tr bt u l mt s
252
253
v y l mt xu thnh di hn:
substr($hw, -6, 5) = worldwide news; # thay th world
Sp xp nng cao
Trc y, bn bit rng bn c th ly mt danh
sch ri sp xp n theo th t ASCII tng dn (nh cc
254
257
sub by_names {
($names{$a} cmp $names{$b}) || ($a cmp $b);
}
Chuyn t
Khi bn mun ly mt xu v thay th mi th
nghim ca mt k t no bng mt k t mi, hay
xo mi th nghim ca mt k t no , bn c th
lm iu vi vic chn la cn thn ch lnh s///.
Nhng gi s bn phi thay i tt c cc a thnh b v tt
c cc b thnh a, sao? Bn khng th lm iu vi hai
ch lnh s/// v ch lnh th hai s hon tc li tt c
nhng thay i do ch lnh th nht thc hin.
Tuy nhin t v, mt php chuyn i d liu nh
vy l n gin - ch cn dng ch lnh tr chun:
tr ab ba < inda >outdata
260
Lu n phm vi cc k t c th c ch ra bng
hai k t c phn cch bi s cho. Nu bn cn mt
s cho hng k t trong xu, t trc n mt s cho
ngc.
Nu xu mi ngn hn xu c, k t cui cng ca
xu mi s c lp li s ln lm cho cc xu c
chiu di nh nhau, ging nh:
$_ = fred and barney;
tr/a-z/ABCDE/d; # $_ by gi l ED AD BAE
262
tr/defghi/abcdd/s; # $_ by gi l aaabbcccabcd
Bi tp
Xem Ph lc A v li gii
1. Vit mt chng trnh c mt danh sch tn tp,
b mi tn thnh phn u v ui. (Mi th cho ti
du s cho cui cng l u, cn mi th sau du
s cho cui cng l ui. Nu khng c s cho, n
tt c l ui.) th vi nhng th nh /fred, barney
263
264
16
Ly mt hiu v
thng tin nhm
ng v m gi
d liu nh phn
Ly thng tin
mng
Ly thng tin
khc
Truy nhp
c s d liu h thng
passwd
Mt hiu mt m ho
265
uid
gid
gcos
dir
shell
266
Lu rng c thm vi gi tr na y so vi tp
mt hiu. Trng $quote bao gi cng trng, v trng
$comment v $gcos c hai cha ton b trng GCOS
(du sao, cng trn mi h thng UNIX ti chi). Cho
nn, vi anh bn c freud, bn c:
(fred, *, 123, 16, , Fred Flintstone,,,, Fred
Flintstone,,,, /home/fred, /bin/csh)
268
}
endpwent ; # lm xong tt
@keys = sort { $home{$a} cmp $home{$b} } key %home;
foreach $login (@keys) { # bc qua cc tn sp xp
print nh ca $login l $home{$login}\n ;
}
Bn gi tr ny tng ng ng vi bn trng ca
tp /etc/group cho nn xem cc m t trong ti liu tham
chiu v dng thc tp ny v chi tit. Cc hm truy
269
Gi v m d liu nh phn
Mt hiu v thng tin nhm c biu din kh p
theo dng vn bn. Cc c s d liu h thng khc c
biu din t nhin hn di cc dng khc. Chng hn,
a ch IP ca mt giao din c qun l ni b nh mt
s bn byte. Trong khi n thng c gii m thnh
biu din vn bn bao gm bn s nguyn nh tch nhau
bi du chm, vic m ho v gii m ny li l n lc b
ph phm nu con ngi trong khi y khng din gii d
liu ny.
Bi iu ny, cc trnh mng trong Perl m c trng
i hay tr li mt a ch IP thng dng xu bn byte
c cha mt k t ch tng byte tun t trong b nh.
Trong khi vic xy dng v din gii xu byte nh vy l
kh trc tip bng vic dng sprintf() v ord() (khng
c trnh by y), Perl cung cp mt li tt c th p
dng c tng ng cho nhiu cu trc kh hn.
Ton t pack() lm vic c i cht nh sprintf(),
nhn mt xu iu khin dng thc v mt danh sch cc
gi tr, ri to ra mt xu t nhng gi tr ny. Tuy nhin
xu dng thc pack c khp vi vic to ra mt cu
trc d liu nh phn. Chng hn, ly bn s nguyn
nh v gi chng theo bn byte lin tip trong mt xu
hp thnh:
$buf = pack (CCCC, 140, 186, 65, 25) ;
270
khng du thnh mt xu l:
$buf = pack (C*, 140, 186, 65,25) ;
Bn gi tr y c nut ht bi mt c t dng
thc. Nu bn mun hai s nguyn ngn theo sau bi
nhiu nht cc k t khng du c th c, bn c th
ni iu g nh:
$buf = pack ( s2 C*, 3241, 5826, 5, 3 , 5, 8, 9, 7, 9, 3,
2) ;
dng
tng
qut
ca
Bi tp
Xem cu tr li Ph lc A.
1. Vit mt chng trnh to ra bng tng ng userID
v tn thc t cc mt hiu, ri dng nh x
cho hin ra danh sch cc tn thc thuc v tng
nhm trong tp nhm. (Danh sch ca bn c cha
nhng ngi dng, ngi c nhm mc nh trong
mt hiu nhng khng ni tng minh v cng nhm
trong nhm, ng khng? Nu khng, lm sao
bn hon thnh c iu ?
276
C s d liu
DBM v mng
DBM
M v ng
mng DBM
Dng mng DBM
C s d liu
truy nhp ngu
nhin chiu di
c nh
C s d liu
(vn bn) chiu
di bin i
17
Thao tc
c s d liu
ngi dng
gi trn a nh mt cp tp c tn dbmfilenam.dir v
dbmfilename.pag. Bt k tn mng kt hp hp php no
cng c th dng c, mc du cc tn mng ch
ton ch hoa, c dng in hnh do s tng t vi
tc hiu tp.
Tham bin $mode l mt s kim sot cc bit cho
php ca cp tp ny nu cc tp cn c to ra. Con
s ny in hnh c xc nh theo h tm: gi tr
thng hay dng nht l 0644 cho php mi ngi ch
c, cn ring ngi ch, c php c-ghi. Nu cc tp
ny tn ti, tham bin ny khng c tc dng. Chng
hn:
dbmopen(%FRED, mydatabase, 0644); # m %FRED
ln mydatabase
Li gi ny kt hp mng kt hp %FRED vi cc
tp a mydatabase.dir v mydatabase.pag trong danh
mc hin ti. Nu cc tp ny cha tn ti, chng c
to ra vi mt 0644.
Gi tr cho li t dbmopen() l ng nu c s d
liu c th m c hay to ra c, v l sai trong
trng hp ngc li, ht nh vic gi open(). Nu bn
khng mun cc tp ny c to ra, dng gi tr $mode
ca undef. Chng hn:
dbmode (%A, /etc/xx, undef) || die khng m c
DBM /etc/xx;
Lu rng tt c nhng iu lm mi ch l b
sung thm du cng vo hng vo/ra.
Mt khi thu c vic m tp, cn di chuyn
quanh n. Bn lm iu ny vi ton t seek(), cng
nhn cng ba tham bin nh trnh th vin fseek(). Tham
bin th nht l tc hiu tp; tham bin th hai l cho
khong chnh, c din gii i km vi tham bin th
ba. Thng thng, bn mun tham bin th ba l khng
cho tham bin th hai chn c v tr tuyt i cho
ln c tip hay ghi tip ln tp. Chng hn, i ti bn
282
286
Bi tp
Xem Ph lc A v li gii
1. To ra mt chng trnh m c s d liu
sendmail v in ra tt c cc mc.
2. To ra hai chng trnh: mt c d liu hnh thoi,
cht n ra thnh cc t, ri cp nht mt tp DBM c
ghi s ln xut hin ca tng t; v chng trnh kia,
m tp DBN v cho hin th kt qu c sp xp
theo s m gim dn. Chy chng trnh th nht
trn vi tp ri xem liu chng trnh th hai c nht
ra s m ng khng.
287
288
18
Chuyn i
cc ngn ng khc
sang Perl
Bi tp
Xem tr li Ph lc A.
1. Chuyn bn ghi lp v sau y thnh chng trnh
Perl:
cat /etc/passwd |
awk -F : {print $1, $6 } |
while read user home
do
newsrc=$home/ .newsrc
if [ -r $newsrc ]
then
293
294
Ph lc A
Tr li cc bi tp
Ph lc ny nu cu tr li cho cc bi tp c cho
cui mi chng.
Chng 2, D liu v hng
1.
295
298
300
$sum = 0.
4.
302
print
The
value
$map{$some_string}\n;
for
$some_string
2.
304
Chng 6, Vo/ra c s
1.
Bn c th ngc nhin s vn tt ca cu tr li
ny, nhng iu ny s lm cho mi vic c thc hin.
y l iu vn xy ra, t bn trong ra:
Trc ht, ton t reverse tm danh sch cc i ca
n. iu ny c ngha l ton t hnh thoi (<>) c tnh
trong hon cnh mng. Vy, tt c cc dng ca cc tp
c tn trong i dng lnh (hoc ci vo chun, nu
khng tp no c nu tn) c c vo, v c
nho nn thnh danh sch vi mi dng mt phn t.
Tip ton t reverse o ngc danh sch t u
n sang u kia.
Cui cng ton t print to ra danh sch kt qu, v
hin th n.
2.
306
Sau y l mt s cu tr li c th
(a) /a+b*/
(b) /\\*\**/ (Nh rng du s cho ngc ph nh
ngha ca k t c bit i sau.)
(c) / ($whatver) {3} / (Bn phi c du ngoc trn,
hoc nu khng, php nhn s p dng vo k t
cui ca $whatever; iu ny cng sai nu
$whatever c k t c bit.)
(d) / [\000-\377] {5} / hay / (.| \n) {5} / (Bn khng th
dng chm mt mnh y, bi v chm khng
snh vi du dng mi.)
(e) / (^| \s) (\S+) (\s+\2)+/ (\S l khng khong trng,
cn \2 l tham chiu ti bt k ci g m t c
th l; du m hay thay th khong trng m
bo rng \S+ bt u ti bin khong trng.)
.
Chng 8, Hm
1.
Nu gi tr v bn tri ca || l ng, n l gi tr ca
ton b biu thc, m s c cho li. Nu n l sai (nh
khi $num ngoi phm vi), v phi ca ton t || c
tnh, cho li $num xem nh gi tr cho li.
Trnh iu khin nhn cc dng lin tip, ct b du
dng mi ca chng ta v mi lc trao chng cho trnh
&card, in ra kt qu.
2.
cu lnh cui l:
print \u$message ;
Nhng khng may l bn khng th t hp cch xy
dng thng bo ny vi vic lm thnh ch hoa cho k t
u tin mt cch d dng.
3.
sub card {
@card_map =
(0, one, two, three, four,
five, six, seven, eight, nine) ;
local ($num) = @_ ;
if ($num < 0) {
$negative = negative ;
$num = - $num ;
}
if ($card_map[$num]) {
$negative . $card_map[$num] ; #
return value
} else {
$negative . $num ; # return value
}
}
314
315
close (IN);
close (OUT);
316
in?
while (<PW>) {
($user, $passwd, $uid, $gid, $gcos) = split(/:/) ;
($real) = split(/,/, $gcos) ;
write;
}
format STDOUT =
@<<<<<<< @>>>>>>> @<<<<<<<<<<<<<<<<<<<<<<<
$user, $uid, $real
.
318
319
close (DOT) ;
up
($basename = $old) =~ s#.*/## ; # get basename of
$old
$new .= /$basename ; and append it to new name
}
rename ($old, $new) ;
up
321
up
($basename = $old) =~ s#.*/## ; # get basename of
$old
$new .= /$basename ; and append it to new name
}
if ($symlink) { # want a symlink
$symlink($old, $new) ;
} else { # want a hard link
link ($old, $new) ;
}
thay cho
shift (@ARGV);
323
} else {
print Get to work!\n ;
}
325
while (<>) {
chop;
$slash = rindex($_, /) ;
$head = substr($_,0,$slash) ;
$tail = substr($_, $slash+1) ;
print head = $head, tail = $tail\n ;
}
3.
in?
while (<PM>) {
327
chop ;
($user, $pm, $uid, $gid, $gcos) = split(/:/) ;
($real) = split(/,/,$gcos) ;
$real {$user} = $real ;
($last = $real) =~ s/^(.*[^a-z]) ? ([^a-z]+.*).*/$2/i ;
$last =~ tr/A-Z/a-z/;
$last {$user} = $last;
}
close (PW) ;
for (sort by_last keys %last) {
printf %30s %8s\n, $real{$_}, $_ ;
}
sub by_last { $last{$a} cmp $;ast{$b}) || ($a cmp $b)}
329
||
die
No
330
2.
332
Ph lc B
C s v ni mng
Mi ngi bao gi cng ti gp ti trn ph, hng
chc ln mt ngy, v hi, Ny, Randal, lm sao ti lm
cho Perl gii quyt khe cm vo/ra?
c, ti mun dy v TCP/IP, nhng khng may
l l ca trang ny qu hp. Cho nn, bn phi gii quyt
mt th d lm vic tht, v c l phi i
OReilly&Associates a ra mt cun sch Perl nng
cao.
M hnh khe cm
Vn i loi l th ny:
1. Tin trnh phc v to ra mt khe cm tng qut
bng socket().
2. B phc v kt ghp khe cm ny vi mt a ch
tho thun qua bind().
333
Mt khch mu
V l mt khch n gin. Khch lm vic thc t
ny ni ti mt a ch xc nh (trong trng hp
ny, daytime chun) trn mt my ch c bit (my
ch cc b), v in ra bt k ci ra no m cng sinh ra.
require sys/socket.ph;
$sockaddr = S n a4 x8;
chop ($hostname = `hostname`) ;
($name, $aliases, $proto) = getprotobyname(tcp);
($name, $aliases, $port) = getservbyname(daytime,
tcp);
($name,
$aliases,
$type,
$len,
$thisaddr)
=
gethostbyname ($hostname);
$thisport = pack($socaddr, &AF_INET, 0, $thisaddr);
$thatport = pack($socaddr, &AF_INET, $port, $thisaddr);
socket(S, &PF_INET, &SOCK_STREAM, $proto) ||
die cannot create socket\n ;
bind (S, $thisport) || die cannot bind socket\n; # optional
connect (S, $thatport) || die cannot connect socket\n ;
while (<S>) {
print;
}
exit 0;
B phc v mu
V l mt b phc v n gin. B phc v ny t
khe cm ti a ch 4242 trn my hin ti. Bt k ai ni
vi cng ny ly c bnh may mn a tuyn. Mi
bnh may mn c dng mt ln (ngu nhin) cho
ti khi tt c cc bnh c n ht. Vy c s bnh
c khi ng li t u.
335
336
Ph lc C
Cc ch cn cha
ni ti
Vng, iu ny ng ngc nhin. Cun sch ny qu
di, th m vn cn ci g n vn cha bao qut ht.
Cc ch thch cui trang cha thm thng tin ph.
Mc ch ca mc ny khng phi l dy cho bn
v nhng iu c lit k ra y, m n gin a
ra mt danh sch. Bn s cn ti Sch con lc hay ti
liu dng Perl (trn nhm h tr Usenet) c thm
thng tin.
Trnh g li
Perl c trnh g li mc ngun tuyt vi.
337
Dng lnh
B thng dch Perl c qu tha thi cc kho dng
lnh.
Cc ton t khc
Ton t phy l mt. V c cch din t do { block; }
khc c trong tay khi bn cn mt khi cu lnh ni
i hi biu thc.
V c mt s bin th v cc php ton, ging nh
vic dng b sa i g cho vic i snh.
Nhiu, nhiu hm na
Vng, Perl c tht nhiu hm, ti khng nh lit k
chng ra y, bi v cch nhanh nht tm ra chng l
c qua mc cc hm trong cun Lp trnh Perl hay ti
liu v perl v nhn vo bt k ci g bn nhn ra khng
ng quan tm.
Nhiu, nhiu bin nh ngha sn
Bn thy vi bin xc nh trc, nh $_.
c, cn nhiu na c.
Xu y
Bn cnh cc xu nhy n v nhy kp, bn cng
c th c cc xu y, ging nh ti liu y trong
lp v:
338
$a = <<HEAD . \n . $body;
To: merlyn@ora.com
From: $username
Subject: What, do you think?
Date: $now
HEAD
342