Svet Perlu: 1. časť / Začíname

perl_logo.png Perl (Prac­ti­cal Extrac­tion and Re­por­ting Lan­gua­ge) vy­tvo­ril v ro­ku 1986 sys­té­mo­vý prog­ra­má­tor Larry Wall pre po­tre­by ria­de­nia a sprá­vy kon­fi­gu­rá­cie sys­té­mov Unix. Perl je (po­dľa ná­zo­ru auto­ra) po­sta­ve­ný na konštruk­ciách ja­zy­ka C a rôz­nych shellov (sed, awk, sh), kto­ré v mno­hých fak­to­roch ďa­lej roz­ši­ru­je a zjed­no­du­šu­je ich zá­pis. Perl sa svo­ji­mi vlas­tnos­ťa­mi prib­li­žu­je k pri­rod­ze­né­mu ja­zy­ku. V sú­čas­nos­ti je­ho po­pu­la­ri­ta prud­ko vzrást­la a po­čet prog­ra­má­to­rov Per­lu sa roz­rás­tol o vý­vo­já­rov inter­ne­to­vých/intra­ne­to­vých rie­še­ní (CGI, ASP). Perl je vo všeo­bec­nos­ti op­ti­ma­li­zo­va­ný na rie­še­nie úloh spra­co­va­nia a vy­hod­no­co­va­nia texto­vých in­for­má­cií (ro­bus­tná po­dpo­ra re­gu­lár­nych vý­ra­zov). Skrip­ty Per­lu sú do veľ­kej mie­ry po­rta­bil­né. Inter­pre­te­ry Per­lu bež­ia nie­len na sys­té­moch Unix, ale aj MS DOS, VMS, OS/2, Ma­cin­tosh a všet­kých klo­noch Win­dows. Nap­riek inter­pre­te­ro­vé­mu cha­rak­te­ru Per­lu je mož­né ho­vo­riť o po­rov­na­teľ­nej a v mno­hých prí­pa­doch vy­ššej efek­ti­vi­te skrip­tov Per­lu op­ro­ti kom­pi­lo­va­ným kon­ku­ren­tom. Inter­pre­ter Per­lu vo fá­ze predspra­co­va­nia skom­pi­lu­je ce­lý skript do inter­me­diál­ne­ho for­má­tu s prih­lad­nu­tím na ap­li­ká­ciu op­ti­ma­li­zač­ných me­tód urý­chlu­jú­cich beh skrip­tu. Po­tom sa tak­to vy­tvo­re­ný inter­me­diál­ny kód od­ov­zdá vo­li­teľ­né­mu mo­du­lu back end, kto­rý ho vy­ko­ná, prí­pad­ne pre­ve­die do ja­zy­ka C ale­bo baj­tkó­du. Op­ro­ti väč­ši­ne Unix shellov ale­bo iným prog­ra­mo­va­cím ja­zy­kom Perl im­pli­cit­ne neob­med­zu­je veľ­kosť pre­men­ných ale­bo maximál­nu hĺbku re­kur­zie. K po­pu­la­ri­te Per­lu pris­pie­va aj dis­tri­buč­ná a mar­ke­tin­go­vá po­li­ti­ka. Perl je dos­tup­ný kaž­dé­mu za­dar­mo.

Cie­ľom toh­to se­riá­lu je nau­čiť vás po­uží­vať ten­to vy­so­ko vý­kon­ný nás­troj v kon­texte s služ­bou World Wide Web. Po nie­koľ­kých úvod­ných čas­tiach sa bu­de pa­ra­lel­ne so se­riálom pre­be­rať te­ma­ti­ka CGI a ASP s roz­siah­ly­mi prík­lad­mi de­monštru­jú­ci­mi si­lu ta­ké­ho prep­ra­co­va­né­ho prog­ra­mo­va­cie­ho ja­zy­ka, akým je Perl. V prík­la­doch bu­de pred­pok­la­da­ný PO­RT pre 32-bi­to­vé Win­dows API.

Syn­tax Per­lu
Skript Per­lu po­zos­tá­va z sek­ven­cie prí­ka­zov a dek­la­rá­cií. Dek­la­rá­cie sú po­vin­né pre vý­stup­né zos­ta­vy a pro­ce­dú­ry. Všet­ky expli­cit­ne nei­ni­cia­li­zo­va­né ob­jek­ty sú auto­ma­tic­ky ini­cia­li­zo­va­né uka­zo­va­te­ľom null ale­bo hod­no­tou 0 („0“). Je mož­né vy­nú­tiť po­vin­né po­uží­va­nie dek­la­rá­cií ob­jek­tov di­rek­tí­vou use strict. Po­stup­nosť hlav­né­ho blo­ku prí­ka­zov je vy­ko­na­ná li­neár­ne raz ale­bo inter­ač­ne pre kaž­dý vstup­ný ele­ment (napr. ria­dok sú­bo­ru), ako to im­ple­men­tu­je sed ale­bo awk.

Ko­men­tá­re
Ko­men­tár je uve­de­ný zna­kom „#“. Text oh­ra­ni­če­ný zna­kom „#“ a CR je inter­pre­te­rom ig­no­ro­va­ný. Ne­zac­ho­vá­va sa syn­tax ko­men­tá­rov ja­zy­ka C ( „/* ... */“ a „// ...“).

Jed­no­duc­hé prí­ka­zy
Jed­no­duc­hý prí­kaz je de­fi­no­va­ný ako vy­hod­no­te­nie vý­ra­zu. Kaž­dý jed­no­duc­hý prí­kaz mu­sí byť ukon­če­ný zna­kom „;“ s vý­nim­kou po­sled­né­ho jed­no­duc­hé­ho prí­ka­zu blo­ku, pre kto­rý je po­uži­tie „;“ ne­po­vin­né, ale od­po­rú­ča­né (údr­žba zdro­jo­vé­ho textu). Jed­no­duc­hý prí­kaz mô­že byť nas­le­do­va­ný jed­ným ne­po­vin­ným mo­di­fi­ká­to­rom tes­ne pred zna­kom „;“ ale­bo ukon­čo­va­cím zna­kom blo­ku. Mož­né mo­di­fi­ká­to­ry sú:

(1) if EXPR
    un­less EXPR
    whi­le EXPR
    un­til EXPR

Sé­man­ti­ka mo­di­fi­ká­to­rov if a un­less je pre an­glic­ky ho­vo­ria­ce­ho prog­ra­má­to­ra pria­mo­čia­ra (2). Pri po­uži­tí mo­di­fi­ká­to­ra if je vy­ko­na­né pri­ra­de­nie v prí­pa­de spl­ne­nej prav­di­vos­tnej po­dmien­ky vý­ra­zu EXPR. Pri­ra­de­nie v dru­hom prí­pa­de je vy­ko­na­né, po­kiaľ je vý­raz EXPR nep­rav­di­vý.

(2) $john = "Me too" if ($ann eq "I lo­ve you"); < = > $john = "Me too" un­less !($ann eq "I lo­ve you");

Sé­man­ti­ka mo­di­fi­ká­to­rov whi­le a un­til je po­dob­ne jed­no­duc­há a ko­reš­pon­du­je s „whi­le loop“ konštruk­cia­mi, keď je po­dmien­ka vy­hod­no­te­ná pred pr­vým vy­ko­na­ním blo­ku. Pri­ra­de­nie je pri po­uži­tí mo­di­fi­ká­to­ra whi­le cyk­lic­ky vy­ko­ná­va­né, po­kiaľ je vý­raz EXPR prav­di­vý. Mo­di­fi­ká­tor un­til vy­nu­cu­je opa­ko­va­né cyk­lic­ké vy­ko­na­nie pri­ra­de­nia, po­kiaľ je vý­raz EXPR nep­rav­di­vý.

(3) $coun­ter++ whi­le ($coun­ter < 10); <=> $coun­ter++ un­til !($coun­ter < 10);

Zlo­že­né prí­ka­zy
Zlo­že­né prí­ka­zy de­fi­nu­je Perl z vý­ra­zov a blo­kov, pri­čom blok je de­fi­no­va­ný ako sku­pi­na prí­ka­zov oh­ra­ni­če­nej plat­nos­ti. Blok je vo väč­ši­ne prí­pa­dov oh­ra­ni­če­ný zlo­že­ný­mi zá­tvor­ka­mi. Pre­to­že zlo­že­né prí­ka­zy sú de­fi­no­va­né po­mo­cou blo­kov, a nie prí­ka­zov, de­fi­ní­cia blo­ku pre zlo­že­ný prí­kaz je po­vin­ná. Nie je mož­né po­uží­vať voľ­né prí­ka­zy, ako nap­rík­lad v Pas­ca­le (5).

(4) if (EXPR) BLOCK
    if (EXPR) BLOCK el­se BLOCK
    if (EXPR) BLOCK el­sif (EXPR) BLOCK ... el­se BLOCK
    LA­BEL whi­le (EXPR) BLOCK
    LA­BEL whi­le (EXPR) BLOCK con­ti­nue BLOCK
    LA­BEL for (EXPR1; EXPR2; EXPR3) BLOCK
    LA­BEL fo­reach VAR (LIST) BLOCK
    LA­BEL BLOCK con­ti­nue BLOCK

(5) if true then exit(0);

Konštruk­cia if (EXPR) ... BLOCK je zná­ma z iných prog­ra­mo­va­cích ja­zy­kov. Blok je vy­ko­na­ný, po­kiaľ je vý­raz EXPR prav­di­vý. V opač­nom prí­pa­de je vy­ko­na­ný ne­po­vin­ný blok za el­se, prí­pad­ne sa ria­de­nie od­ov­zdá se­kun­dár­ne­mu blo­ku el­sif (EXPR) ... . Po­vin­ná dek­la­rá­cia blo­kov za­bez­pe­ču­je ko­rek­tné sprá­va­nie via­cú­rov­ňo­vých konštruk­cií if (EXPR) el­seif (EXPR) el­se ..., pre kto­ré exak­tne de­fi­nu­je prís­luš­nosť. Iný­mi slo­va­mi, nik­dy ne­nas­ta­ne ne­jed­noz­nač­nosť prís­luš­nos­ti el­se (el­seif) k if. Nap­rík­lad konštruk­cia Pas­ca­lu (6) sa mô­že chá­pať ako (7) ale­bo (8), pri­čom bu­de vy­ko­na­ná ako (7).

(6) if j then if i=1 then i:=5 el­se if i=1 then i:=3;(7) if j then be­gin               if i=1 then i:=5                      el­se if i=1 then i:=3;              end;(8) if j then be­gin               if i=1 then i:=5              end el­se
               if i=1 then i:=3;

Konštruk­cia whi­le (EXPR) BLOCK za­bez­pe­ču­je opa­ko­va­né cyk­lic­ké vy­ko­ná­va­nie blo­ku za dodr­ža­nia prav­di­vos­ti vý­ra­zu EXPR. Ne­po­vin­ná sek­cia con­ti­nue BLOCK je vy­ko­na­ná vždy pred vy­hod­no­te­ním vý­ra­zu EXPR a mô­že slú­žiť na in­kre­men­ciu ale­bo dek­re­men­ciu pre­men­ných cyk­lu po­dob­ne ako tre­tia časť cyk­lu ja­zy­ku C. Op­ro­ti ja­zy­ku C je mož­né po­mo­cou konštruk­cie whi­le (EXPR) BLOCK con­ti­nue BLOCK de­fi­no­vať cyk­lus so správ­nou sé­man­ti­kou s prih­liad­nu­tím na mož­né po­uži­tie ria­dia­ce­ho prí­ka­zu cyk­lu next [Frag­men­ty (9) a (10) sú fun­kčne ek­vi­va­len­tné]. Ne­po­vin­né ná­ves­tie LA­BEL jed­noz­nač­ne iden­ti­fi­ku­je konštruk­ciu BLOCK a po­uží­va sa v sú­vis­los­ti s prí­kaz­mi ria­de­nia cyk­lu.

(9) $i = 1;
    whi­le ($i < 10) {     ...    } con­ti­nue {
      $i++
}Konštruk­cia kla­sic­ké­ho cyk­lu for (EXPR1; EXPR2; EXPR3;) BLOCK za­bez­pe­ču­je cyk­lic­ké vy­ko­ná­va­nie blo­ku, po­kiaľ je vý­raz EXPR2 prav­di­vý, pri­čom pred kaž­dým vy­hod­no­te­ním vý­ra­zu EXPR2 je vy­hod­no­te­ný vý­raz EXPR3. Pro­ces opa­ko­va­ných inter­ácíi za­čí­na vy­hod­no­te­ním vý­ra­zu EXPR1. Všet­ky tri vý­ra­zy sú ne­po­vin­né. Bliž­šie neš­pe­ci­fi­ko­va­ný vý­raz je vy­hod­no­te­ný ako prav­di­vý. Je mož­né de­fi­no­vať cyk­lus s via­ce­rý­mi ria­dia­ci­mi pre­men­ný­mi (11). Ako od­de­ľo­vač pa­ra­lel­ných pre­men­ných je po­uži­tý znak „,“.(10) for ($i = 1; $i < 10; $i++) { ... }(11) for ($count1=10, $count2=0; $count1 != $count2; $count1--, $count2++ ) { ...
};Konštruk­cia fo­reach vy­ko­ná blok pre kaž­dý pr­vok zoz­na­mu LIST. Pred kaž­dou inter­áciou je vy­ko­na­ná ini­cia­li­zá­cia ria­dia­cej pre­men­nej VAR, kto­rá je pre da­ný cyk­lus lo­kál­na a po je­ho opus­te­ný na­do­bú­da svo­ju pô­vod­nú hod­no­tu. Ria­dia­ca pre­men­ná je im­pli­cit­ným syn­ony­mom prís­luš­né­ho pr­vku po­ľa, pre­to je mož­né jej mo­di­fi­ká­ciou nep­ria­mo mo­di­fi­ko­vať zá­zna­my da­né­ho po­ľa. Pri ab­sen­cii expli­cit­nej de­fi­ní­cie ria­dia­cej pre­men­nej je po­uži­tá ako ria­dia­ca pre­men­ná $_. Kľú­čo­vé slo­vo fo­reach je syn­ony­mom kľú­čo­vé­ho slo­va for a bo­lo vy­tvo­re­né na zvý­še­nie či­ta­teľ­nos­ti zdro­jo­vé­ho textu. Frag­men­ty (12) a (13) sú fun­kčne ek­vi­va­len­tné.(12) for (1, 2, 3) { print; };(13) fo­reach $temp (1, 2, 3) { print $temp; };Ria­dia­ce prí­ka­zy­Po­čas inter­ácie je prís­tup­ná tro­ji­ca ria­dia­cich prí­ka­zov ov­plyv­ňu­jú­cich ria­de­nie inter­ácií. Pr­vým z tro­ji­ce ria­dia­cich prí­ka­zov je next (ek­vi­va­len­cia con­ti­nue ja­zy­ka C), kto­rý ukon­ču­je ak­tuál­ne vy­ko­ná­va­nú inter­áciu a ria­de­nie od­ov­zdá­va sek­cii mo­di­fi­ká­cie ria­dia­cej pre­men­nej. Prík­la­dom mô­že byť cyk­lus spra­co­va­nia riad­kov vstup­né­ho sú­bo­ru s im­ple­men­tá­ciou filtra ko­men­tá­rov (14).Dru­hý je ria­dia­ci prí­kaz last (ek­vi­va­len­cia break ja­zy­ka C), kto­rý expli­cit­ne vy­nu­cu­je ukon­če­nie vy­ko­ná­va­nia prís­luš­né­ho cyk­lu. Prí­pad­ná sek­cia con­ti­nue nie je vy­ko­na­ná (14).Po­sled­ným z tro­ji­ce je ria­dia­ci prí­kaz re­do, vy­nu­cu­jú­ci zno­vu vy­ko­na­nie inter­ácie bez mo­di­fi­ká­cie ria­dia­cej pre­men­nej. Prí­pad­ná sek­cia con­ti­nue nie je vy­ko­na­ná.
Fun­kcia ria­dia­cich prí­ka­zov sa im­pli­cit­ne vzťa­hu­je na ak­tuál­ne vy­ko­ná­va­ný cyk­lus. Po­kiaľ je za ria­dia­cim prí­ka­zom uve­de­ný ne­po­vin­ný pa­ra­me­ter ná­ves­tia, je­ho fun­kčnosť sa bu­de vzťa­ho­vať na cyk­lus ozna­če­ný da­ným ná­ves­tím. Ta­kým­to spô­so­bom mož­no ov­plyv­niť vy­ko­ná­va­nie cyk­lu na vy­ššej úrov­ni.(14) whi­le { next if /^#/; # pred­čas­ne ukon­či inter­áciu pri ko­men­tá­ri last if /^$/; # ukon­či cyk­lus po pr­vom práz­dnom riad­ku ... }Jed­no­duc­hé blo­ky­Jed­no­duc­hý blok je sé­man­tic­ky ek­vi­va­lent­ný s cyk­lom, pri­čom je prí­pus­tné po­uži­tie ria­dia­cich prí­ka­zov. Blok con­ti­nue je ne­po­vin­ný. Jed­no­duc­hý blok je mož­né opus­tiť ľu­bo­voľ­ným z tro­ji­ce ria­dia­cich prí­ka­zov, pri­čom po­uži­tie prí­ka­zu next vy­vo­lá do­da­toč­né vy­ko­na­nie cyk­lu con­ti­nue. Po­mo­cou jed­no­du­chých blo­kov je mož­né im­ple­men­to­vať štruk­tú­ry vet­ve­nia. Frag­ment (15) de­monštru­je tri prís­tu­py k zá­pi­su tes­tu. Sa­moz­rej­me, mož­no po­užiť via­cú­rov­ňo­vú konštruk­ciu if (EXPR) BLOCK el­sif.(15) CA­SE: { if ($a == 1) {$b = 3; last CA­SE; };
$b = 2, last CA­SE if ($a == 2);
($a == 3) and $b = 1, last CA­SE;
$b = 0;
}Go­to­Met­la prog­ra­má­tor­ské­ho štý­lu a/ale­bo sil­ný nás­troj, kto­rý je pred­me­tom mno­hých spo­rov o čis­to­tu prog­ra­mo­va­nia. Nap­riek to­mu Perl im­ple­men­tu­je prí­kaz go­to, a to hneď v troch va­rian­toch. Naj­jed­no­duc­hší va­riant go­to LA­BEL od­ov­zdá­va ria­de­nie prí­ka­zu ozna­če­né­ho ná­ves­tím LA­BEL. Nie je mož­né od­ov­zdať ria­de­nie do blo­ku vy­ža­du­jú­ce­ho ini­cia­li­zá­ciu (po­dprog­ram, cyk­lus) ale­bo do blo­ku s im­ple­men­to­va­nou op­ti­ma­li­zá­ciou inter­pre­te­rom. Dru­hým va­rian­tom je go­to EXPR, pri­čom vy­hod­no­te­ním vý­ra­zu EXPR je mož­né zís­kať ná­ves­tie (16).Po­sled­ným z tro­ji­ce va­rian­tov je go­to &NA­ME, kto­rý sub­sti­tuu­je vo­la­nie da­né­ho po­dprog­ra­mu. Po­uží­va sa v prog­ra­moch AUTO­LOAD (nie­ke­dy na­bu­dú­ce).(16) go­to (“LA­BEL1”, “LA­BEL2”, “LA­BE­L3”) [$whe­re]Dá­to­vé ty­py­Perl im­ple­men­tu­je tri ty­py dá­to­vých štruk­túr: ska­lá­ry, po­lia ska­lá­rov a aso­cia­tív­ne po­lia (hash po­lia). Po­lia ska­lá­rov sú in­dexova­né ce­lý­mi čís­la­mi s naj­niž­ším in­dexom rov­ným nu­le. In­dexy zá­por­nej hod­no­ty pris­tu­pu­jú k pr­vkom v re­ver­znom po­ra­dí. Aso­cia­tív­ne po­lia sú in­dexova­né re­ťaz­ca­mi.Iden­ti­fi­ká­tor pre­men­nej sa skla­dá zo zna­ku iden­ti­fi­ku­jú­ce­ho typ pre­men­nej (tab. 1) a je­ho náz­vu. Pr­vý znak náz­vu pre­men­nej mô­že byť ľu­bo­voľ­ný znak abe­ce­dy ale­bo znak „_“, kto­rý mô­že byť nas­le­do­va­ný ľu­bo­voľ­ný­mi znak­mi abe­ce­dy, čís­li­ca­mi ale­bo zna­kom „_“ s dodr­ža­ním maximál­nej dĺžky 255 zna­kov. Náz­vy iden­ti­fi­ká­to­rov s pr­vým čís­li­co­vým zna­kom mô­žu byť nas­le­do­va­né len znak­mi čís­lic. Dĺžka náz­vu iden­ti­fi­ká­to­ra s pr­vým zna­kom rôz­nym od zna­ku abe­ce­dy, čís­li­ce ale­bo „_“ je ob­med­ze­ná na 1. Iden­ti­fi­ká­to­ry s jed­noz­na­ko­vý­mi náz­va­mi ma­jú vo väč­ši­ne prí­pa­dov vop­red ur­če­ný vý­znam. Náz­vy iden­ti­fi­ká­to­rov roz­li­šu­jú veľ­ké a ma­lé pís­me­ná abe­ce­dy.Tab 1. Roz­li­šu­jú­ce zna­ky iden­ti­fi­ká­to­rov­Znak Pre­men­ná
$ ska­lár@ po­le ska­lá­rov% aso­cia­tív­ne po­leS­ka­lár­ne hod­no­tyS­ka­lár­ne pre­men­né mô­žu uc­ho­vá­vať čís­la, re­ťaz­ce ale­bo re­fe­ren­cie. Kon­ver­zie med­zi jed­not­li­vý­mi for­mát­mi sú úpl­ne tran­spa­ren­tné. Ska­lár je vy­hod­no­te­ný ako prav­di­vý, po­kiaľ neob­sa­hu­je hod­no­tu null, hod­no­tu 0 ale­bo re­ťa­zec „0“. Exis­tu­jú dve rôz­ne hod­no­ty null: de­fi­no­va­ná a ne­de­fi­no­va­ná. Ne­de­fi­no­va­ná hod­no­ta null je pri­ra­de­ná ska­lá­ru pri po­ku­se o pri­ra­de­nie ne­vy­jad­ri­teľ­nej hod­no­ty, prí­pad­ne pri vý­sky­te chy­by. Tú­to hod­no­tu je mož­né tes­to­vať fun­kciou de­fi­ned(). De­fi­no­va­nú hod­no­tu null mô­že­me expli­cit­ne pri­ra­diť da­né­mu ska­lá­ru.(17) $foo = null;Ska­lár­ne konštruk­to­ry Čí­sel­ný li­te­rál je špe­ci­fi­ko­va­ný čí­sel­ným for­má­tom po­dľa tab. 2. Tab. 2 Čí­sel­né for­má­ty­Zá­pis Opis12345 ce­lo­čí­sel­ný zá­pis12345.67 de­sa­tin­ný zá­pis.23E-10 expo­nen­ciál­ny zá­pis0xffff hexade­ci­mál­ny zá­pis0377 ok­ta­no­vý zá­pis4_294_967_296 čís­la s zna­kom „_“ pre zvý­še­nia či­ta­teľ­nos­ti­Re­ťa­zo­vé li­te­rá­ly sú oh­ra­ni­če­né zna­kom „““ ale­bo „’“. Pri po­uži­tí zna­ku úvod­zov­ky sú vnút­ri li­te­rá­lu vy­ko­na­né sub­sti­tú­cie pre­men­ných a je po­vin­né po­uži­tie backslash (tab. 3). Pri po­uži­tí apos­tro­fu nie je vy­ko­ná­va­ná sub­sti­tú­cia pre­men­ných. Vlo­že­nie apos­tro­fu a zna­ku backslash je mož­né po­mo­cou sek­ven­cií „\’“ a „\\“. Prak­tic­ky je po­uži­tie sub­sti­tú­cie je len vý­hod­ným „spo­jo­va­ním“ re­ťa­zo­vých li­te­rá­lov. Ná­zov pre­men­nej sa od­po­rú­ča oh­ra­ni­čiť zlo­že­ný­mi zá­tvor­ka­mi z dô­vo­du za­med­ze­nia ne­jed­noz­nač­nos­ti vy­plý­va­jú­cich z sku­toč­nos­ti neexis­ten­cie exak­tne de­fi­no­va­nej hra­ni­ce med­zi náz­vom pre­men­nej a os­tat­né­ho textu.(18) $num = ‘$100‘; #zob­ra­zí „So­met­hing $100 So­met­hing $100Sk“ print "So­met­hing $num So­met­hing ${num}Sk\n"; #zob­ra­zí „So­met­hing $100 So­met­hing” print "So­met­hing $num So­met­hing $numSk\n"; Tab. 3 Špe­ciál­ne zna­ky a mo­di­fi­ká­to­ry re­ťa­zo­vých li­te­rá­lov­Znač­ka
Opis\t tab (HT, TAB)
\n newli­ne (LF, NL)
\r re­turn (CR)
\f form feed (FF)
\b bac­kspa­ce (BS)
\a alarm (bell) (BEL) \e es­ca­pe (ESC)
\033 znak vy­jad­re­ný ok­ta­no­vo\x1b znak vy­jad­re­ný hexade­ci­mál­ne\l nas­le­du­jú­ci znak bu­de pre­ve­de­ný na „ma­lé pís­me­no“\u nas­le­du­jú­ci znak bu­de pre­ve­de­ný na „veľ­ké pís­me­no“\L všet­ky nas­le­du­jú­ce zna­ky bu­dú pre­ve­de­né na „ma­lé“ ek­vi­va­len­ty až do vý­sky­tu \E
\U všet­ky nas­le­du­jú­ce zna­ky bu­dú pre­ve­de­né na „veľ­ké“ ek­vi­va­len­ty až do vý­sky­tu \E\E ukon­čo­va­cí znak sek­ven­cie zme­ny „veľ­kos­ti“ pís­men­Konštruk­to­ry po­lí ska­lá­rov
Po­le ska­lá­rov (nie­ke­dy ozna­čo­va­né ako zoz­nam) im­ple­men­tu­je us­po­ria­da­nú po­stup­nosť pr­vkov. V kon­texte zoz­na­mu je hod­no­tou po­ľa ska­lá­rov us­po­ria­da­ná po­stup­nosť jed­not­li­vých pr­vkov. V ska­lár­nom kon­texte je hod­no­tou zoz­na­mo­vé­ho li­te­rá­lu po­sled­ný pr­vok zoz­na­mu. Pre­to pri­ra­de­nie (19) ini­cia­li­zu­je po­le @list da­ným zoz­na­mom, ale pri­ra­de­nie (20) pri­ra­dí pre­men­nej $var hod­no­tu po­sled­né­ho pr­vku da­né­ho po­ľa. Pre­men­ná zoz­na­mu vra­cia v zoz­na­mo­vom kon­texte svoj ob­sah. V ska­lár­nom kon­texte sa vrá­ti cel­ko­vý po­čet pr­vkov (21).
(19) @list = (3, 2, 1);
(20) $var  = (3, 2, 1); # $var == 1
(21) $var  = @list;     # $var == 3

K jed­not­li­vým pr­vkom po­ľa ska­lá­rov sa pris­tu­pu­je po­dľa syn­taxe vy­jad­re­nej (22). Pri­da­nie pr­vku nap­rík­lad na ko­niec zoz­na­mu @list ini­cia­li­zo­va­ným (19) mož­no vy­ko­nať po­uži­tím konštruk­cie (23). Vy­ra­de­nie ale­bo pre­pí­sa­nie pr­vkov zoz­na­mu je mož­né vy­ko­nať po­mo­cou fun­kcie spli­ce (24), kto­rá vy­ko­ná­va sub­sti­tú­ciu na zoz­na­me ARRAY od in­dexu OF­FSET s dĺžkou LENGTH a zoz­na­mom LIST. Po­sled­né dva pa­ra­met­re sú ne­po­vin­né.

(22) $list_na­me[list_ele­ment_num­ber] 
(23) $list[3] = 0; # @list == (3, 2, 1, 0)
(24) spli­ce ARRAY, OF­FSET, LENGTH, LIST
     spli­ce ARRAY, OF­FSET, LENGTH
     spli­ce ARRAY, OF­FSET 

Iný­mi za­ují­ma­vý­mi fun­kcia­mi ope­ru­jú­ci­mi na zoz­na­moch sú dvo­ji­ce push/pop a shift/un­shift im­ple­men­tu­jú­ce zá­sob­ník. Fun­kcia push pri­dá­va zoz­nam na ko­niec pri­már­ne­ho zoz­na­mu a tým ho roz­ši­ru­je (25). Fun­kcia push je fun­kčne ek­vi­va­len­tná s konštruk­cia­mi (26) a (27). Fun­kcia pop, nao­pak, vra­cia hod­no­tu pr­vku s naj­vyš­ším in­dexom (28). Po­kiaľ zoz­nam neob­sa­hu­je ni­ja­ké pr­vky, vrá­ti sa ne­de­fi­no­va­ná hod­no­ta null. Fun­kčne je fun­kcia pop ek­vi­va­len­tná s konštruk­cia­mi (29) a (30). Dvo­ji­ca fun­kcií shift/un­shift ope­ru­je po­dob­ne na za­čiat­ku zoz­na­mu.

(25) push ARRAY, LIST
(26) for $va­lue (@LIST) {
      $ARRAY[++$#LIST] = $va­lue;
     }
(27) spli­ce(@ARRAY, $#ARRAY+1, 0, $a1, $a2) <=> push(@ARRAY, $a1, $a2)

(28) pop ARRAY
(29) $last = $ARRAY[$#ARRAY--]
(30) spli­ce(@ARRAY,-1) <=> pop(@ARRAY)

(31) un­shift ARRAY, LIST
(32) spli­ce(@ARRAY, 0, 0, $a1, $a2) <=> un­shift(@ARRAY, $a1, $a2)

(33) shift ARRAY
(34) spli­ce(@ARRAY, 0, 1) <=> shift(@ARRAY)

Konštruk­to­ry aso­cia­tív­nych po­lí
Aso­cia­tív­ne po­le (hash) je špe­ciál­ny druh po­ľa ska­lá­rov, in­dexova­ný re­ťaz­ca­mi (aso­ciá­cia kľúč/hod­no­ta). K jed­not­li­vým pr­vkom aso­cia­tív­ne­ho po­ľa sa pris­tu­pu­je po­dľa syn­taxe vy­jad­re­nej (36), kde key je kľúč aso­cio­va­nej dvo­ji­ce kľúč/hod­no­ta. Po­mo­cou fun­kcie de­le­te je mož­né vy­ra­diť dvo­ji­cu kľúč/hod­no­ta z aso­cia­tív­ne­ho po­la. Inter­ácie pre kaž­dú dvo­ji­cu klúč/hod­no­ta im­ple­men­tu­je konštruk­cia (38), kde fun­kcia each (37) vra­cia v zoz­na­mo­vom kon­texte dvojpr­vko­vý zoz­nam ob­sa­hu­jú­ci kľúč a hod­no­tu. Ukon­če­nie inter­ácií (38) je za­bez­pe­če­né fun­kciou each vo vlas­tnej ré­žii, kto­rá po od­os­la­ní po­sled­né­ho zoz­na­mu vrá­ti ne­de­fi­no­va­nú hod­no­tu null (vy­hod­no­te­né ako fal­se). V ska­lár­nom kon­texte je sprá­va­nie fun­kcie each po­dob­né s tým roz­die­lom, že sú na vý­stup od­osie­la­né len kľú­če. Po­čas inter­ácií nie je mož­né pri­dá­vať no­vé dvo­ji­ce kľúč/hod­no­ta do aso­cia­tív­ne­ho po­la. Pro­ces inter­ácií mô­že byť „re­se­to­va­ný“ len svo­jím ko­rek­tným ukon­če­ním. Kľú­če a hod­no­ty sú sa­mos­tat­ne prís­tup­né po­mo­cou fun­kcií keys (39) a va­lues (41).

(35) %hash = (‘key1‘, ‘va­lue1‘, ‘key2‘, ‘va­lue2‘, ‘key3‘, ‘va­lue3‘);
     %hash = ( key1 => va­lue1
               key2 => va­lue2
               key3 => va­lue3 );
(35) $hash{‘key’}
(36) de­le­te($hash{‘key’})
(37) each AS­SOC_ARRAY 
(38) whi­le (($key,$va­lue) = each %ENV) {
      print "$key=$va­lue\n";
     }
(39) keys AS­SOC_ARRAY 
(40) @keys = keys %ENV;
     @va­lues = va­lues %ENV;
     whi­le ($#keys >= 0) {
      print pop(@keys), '=', pop(@va­lues), "\n";
     }
(41) va­lues AS­SOC_ARRAY

Kam by ste sa ma­li ísť ur­či­te po­zrieť http://www.perl.org

Ďal­šie čas­ti >>

Zdroj: PC Revue 1/1998



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

Svet Per­lu: 3. časť / Re­fe­ren­cie a po­dprog­ra­my
Jedným zo závažných nedostatkov Perlu bola donedávna absencia podpory komplexných dátových štruktúr podobných pascalovským záznamom alebo štruktúram jazyka C. čítať »
 
Svet Per­lu: 2. časť / Re­gu­lár­ne vý­ra­zy
Ako sme už v prvej časti seriálu načrtli, majoritná časť skriptov Perlu je vyvíjaná pre potreby spracovania textových informácií, pre ktoré Perl implementuje čítať »
 
Svet Per­lu: 1. časť / Za­čí­na­me
Perl (Practical Extraction and Reporting Language) vytvoril v roku 1986 systémový programátor Larry Wall pre potreby riadenia a správy konfigurácie systémov Unix. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter