Valdymo struktūros ir reguliariosios išraiškos

false reikšmė

reikškinys perl'e interpretuojamas kaip false kai jo reikšmė lygi:
undef
0;
'';
'0'
visos kitos reikšmės yra interpretuojamos kaip true.

Valdymo struktūros

sakiniai gali būti grupuojami į blokus apskliaudžiant { } skliaustais;
{
	sakinys_1;
	sakinys_2;
	....
	sakinys_N;
}
bloko reikšmė yra paskutinio jame įvykdyto sakinio reikšmė;
vietose, kur analogiška C kalbos konstrukcija leidžia būti sakinį, perl'as reikalauja, kad ten būtų naudojamas blokas. T.y. struktūriniuose sakiniuose, veiksmai turi būti suskliausti, net jei jiems aprašyti užtenka vieno sakinio!

Sąlyginis sakinys

sintaksė
if (sąlyga) blokas
[ elsif (sąlyga) blokas ] ...
[ else blokas ]
unless (sąlyga) blokas1
[ elsif (sąlyga) blokas2 ] ...
[ else blokasN ]
elsif dalis gali kartotis tiek kartų, kiek reikia, arba jos gali nebūti iš viso;
else dalis yra nebūtina.
unless atveju, blokas1 yra vykdomas tik tada, kai sąlygos reikšmė yra false. elsif ir else dalys yra nagrinėjamos tik tuo atveju, jei blokas1 yra nevykdomas.
pavyzdžiai:
if ($a == 10) {
  $iv = 'puikiai';
} elsif ($a == 9) {
  $iv = 'l. gerai';
} elsif ($a == 8) {
  $iv = 'gerai';
} else {
  $iv = 'Hmmmm :-/';
}
unless ($a > 7) {
  $iv = 'Vajeee :-///';
} elsif ($a == 9) {
  $iv = 'l. gerai';
} elsif ($a == 8) {
  $iv = 'gerai';
} else {
  $iv = 'Puikiai!';
}
if ir unless gali būti naudojami ir kaip modifikatoriai. Sintaksė:
sakinys if (sąlyga)
sakinys unless (sąlyga)
Šiuo atveju sakinys bus įvykdytas tik tuo atveju, jei sąlyga bus arba nebus patenkinta, atitinkamai.
Naudojant ||, && ir ?: operatorius taip pat galima nurodyti, kada vykdyti ar nevykdyti sakinio.
sakinys1 || sakinys2 || ... || sakinysN; sakinysX bus vykdomas tik tuo atveju, jei prieš tai buvusio sakinio reikšmė buvo false
sakinys1 && sakinys2 && ... && sakinysN; sakinysX bus vykdomas tik tada, kai prieš tai buvusio sakinio reikšmė buvo true
sakinys1 ? sakinys2 : sakinys3; sakinys2 bus vykdomas tada, kai sakinys1 grąžino true, priešingu atveju bus vykdomas sakinys3

Ciklai

Sintaksės variantai
1.[žymė] while ( išraiška ) blokas [continue blokas]
2.[žymė] for ( išraiška1; išraiška2 ; išraiška3 ) blokas
3.[žymė] foreach kintamasis ( išraiška ) blokas
4.[žymė] blokas1 continue blokas2
  • while ciklo blokas yra vykdomas tol, kol išraiškos reikšmė yra true;
  • for ciklas dirba taip pat, kaip ir C kalboje;
  • foreach ciklas įvykdo bloką kiekvieną masyvo, gauto suskaičiavus išraiška reikšmę, priskyręs kintamajam. Reikšmės iš masyvo yra imamos nuo pirmos iki paskutinės;
  • jei ciklas turi continue bloką, tai šis blokas yra vykdomas prieš kiekvieną tikrinimą, ar reikės dar vienos iteracijos;
  • žymė yra vardas, po kurio seka dvitaškis :

    Ciklo valdymo funkcijos

    Sintaksės variantai
    1.next [žymė];
    2.last [žymė];
    3.redo [žymė];
  • next pasako, kad ciklo blokas su šia reikšme jau yra įvykdytas ir reikia pereiti prie sekančios reikšmės;
  • last pasako, kad tai yra paskutinė ciklo iteracija - toliau vykdomas sakinys, esantis už ciklo sakinio;
  • redo pasako, kad ciklo bloką reikia dar kartą įvykdyti su dabar esančiomis kintamųjų reikšmėmis. continue blokas nėra vykdomas, ciklo sąlyga nėra tikrinama;
  • jei nenurodyta jokia žymė, suprantama, kad veiksmus reikia atlikti su giliausiai esančiu ciklu.

    Šablonai. Reguliariosios išraiškos

  • Paieškai eilutėse, pakeitimams ir keliose kitose vietose yra naudojami šablonai;
  • Šablonai susideda iš vienos ar kelių reguliarių išraiškų - taisyklių, kas domina programą
  • Reguliariose išraiškose simbolis atitinka pats save, jei tai nėra metasimbolis (jų sąrašas žemiau);

    Metasimboliai ir jų prasmė

    • \ - tolesnį metasimbolį interpretuoti literaliai - kaip parašyta
    • ^ - atitinka eilutės pradžią
    • . - atitinka bet kokį simbolį (išskyrus perėjima į kitą eilutę, jei priešingai nenurodyta modifikatoriumi)
    • $ - atitinka eilutės pabaigą (šablono pabaigoje; kitur nurodo, kad į šabloną reikia įterpti kintamojo reikšmę)
    • | - skiria alternatyvas
    • () - naudojami grupavimui
    • [] - nurodo simbolių klasę, kuri gali būti naudojama šioje vietoje
    • \t - tabuliacija (HT, TAB)
    • \n - nauja eilutė (LF, NL)
    • \r - "karietėlės" grąžinimas (CR)
    • \f - puslapio prasukimas (FF)
    • \a - "skambutis"
    • \e - escape
    • \033 - simbolis su nurodyta reikšme (aštuntainėje sistemoje)
    • \x1B - simbolis su nurodyta reikšme (šešioliktainėje sistemoje)
    • \c[ - control-simbolis
    • \l - tolesnė raidė - mažoji
    • \u - tolesnė raidė - didžioji
    • \L - tolesnės raidės iki \E - mažosios
    • \U - tolesnės raidės iki \E - didžiosios
    • \E - keitimo pabaiga
    • \Q - cituoti metasimbolius iki \E literaliai
    • \w - žodžio dalis (raidės, skaičiai, _ ženklas)
    • \W - neŽodžio dalis (viskas, išskyrus \w)
    • \s - tuščia vieta (tarpas, tabuliacija)
    • \S - netuščia vieta
    • \d - skaitmuo
    • \D - ne skaitmuo
    • \b - žodžio riba (vieta, kur prasideda arba baigiasi žodis)
    • \B - ne žodžio riba (visos vietos, išskyrus tas, kur prasideda arba baigiasi žodis)
    • \A - eilutės pradžia
    • \Z - eilutės pabaiga
    • \G - vieta, kur baigė prieš tai veikusi m//g komanda
    • \0 - simbolis, turinti kodą 0
    • \skaičius - tekstas, kuris atitiko reguliariąją išraišką, buvusią skaičiumi nurodytuose skliaustuose (numeruojama nuo 1). Ilgesni, nei 1 skaitmens skaičiai yra leistini, jei iki tos vietos jau buvo daugiau kaip 10 skliaustų porų
    Po šablono panaudojimo yra nustatomi tokie kintamieji:
    • $skaičius
      skaičiumi apibrežtuose skliaustuose buvusią reguliariąją išraišką atitikęs tekstas. Skliaustai numeruojami nuo 1
    • $&
      visas tekstas, atitikęs šabloną
    • $`
      tekstas likęs prieš šabloną (globalinio pakeitimo atveju pakeitimai nėra atspindėti šiame tekste)
    • $'
      tekstas likęs už šablono
    Papildomos galimybės:
    • (?:regexp)
      nurodo, kad skliaustuose esančios reguliariosios išraiškos reikia nepriskyrinėti $skaičius kintamąjam;
    • (?=regexp)
      Nurodo reguliariąją išraišką, kuri turi sekti, tačiau kuri neturi pakliūti į specialųjį kintamąjį $&;
    • (?!regexp)
      Nurodo reguliariąją išraišką, kuri turi būti netenkinama;
    • (?imsx)
      leidžia nurodyti modifikatorius (žr. žemiau)

    Kartojimo nurodymas

    Žemiau išvardinti simboliai pasako, kad prieš juos buvusi reguliarioji išraiška gali pasitaikyti eilutėje tam tikrą kiekį kartų.
    • * - kartoti 0 ir daugiau kartų
    • + - kartoti 1 ir daugiau kartų
    • ? - kartoti 1 arba 0 kartų
    • {n} - kartoti tiksliai n kartų
    • {n,} - kartoti n ir daugiau kartų
    • {n,m} - kartotji bent n, bet ne daugiau kaip m kartų
    Reguliaroji išraiška su kartojimo nurodymu ieško taip, kad rastų ilgiausią imanomą seką. T.y. "gersiu kavą arba arbatą" =~ /^(.*)arba/ $1 priskirs eilutę "gersiu kavą arba ". Jei mums buvo reikalinga eilutė tik iki pirmo teksto arba pasikartojimo - po kartojimo zenklo galima dėti ? ženklą. Išraiška "gersiu kavą arba arbatą" ~= /^(.*?)arba/ kintamąjam $1 priskirs "gersiu kavą ".

    Modifikatoriai

    • i - lyginimas nepriklauso nuo raidžių registro
    • m - nurodyti, kad lyginimas eina per kelias eilute - pakeisti ^ ir $ prasmę - su šiuo modifikatoriumi simboliai žymi vienos eilutės pradžią ir pabaigą atitinkamai
    • s - laikyti viena eilute (. gali reikšti ir perėjimą prie naujos eilutės (\n).
    • x - leisti tuščią vietą ir komentarus reguliariosios išraiškos viduje

    Šablonų panaudojimas

    Paieškos operatorius m//

  • sintaksė
    /šablonas/[g][i][o]
    m/šablonas/[g][i][o]
  • m yra nebūtinas, jei šablonui atskirti yra naudojamas simbolis /
  • jei šablone yra daug simbolių /, tai kaip šablono skyriklį galima naudoti kitokį specialų simbolį (pvz., m#/usr/local/lib/#)
  • šablono ieškoma spec.kintamajame $_ arba išraiškoje, nurodytoje operatoriumi =~ (pvz., $eilute =~ /Nauja!/)
  • modifikatorius i nurodo, kad paieška turi būti vykdoma neatsižvelgiant į raidžių reigistrą
  • modifikatorius o nurodo, kad visi kintamieji, kurie yra naudojami šablone būtų "įstatomi" pirma kartą vykdant programą
  • modifikatorius g nurodo, kad reikia surasti argumente visus šabloną atitinkačius teksto fragmentus. Skaliariniame kontekste raktas dirbtų kaip iteratorius (pvz., while (/\w+/g){...}). Masyvo kontekste rezultatas būtų visų surastų fragmentų masyvas. Be šio rakto masyvo kontekste būtų gražinamas masyvas ($1, $2, ...) - šie kintamieji, bei $&, $` ir $' nebūtų nustatinėjami

    Pakeitimo operatorius s///

  • sintaksė
    s/šablonas/pakaitalas/[g][i][o][e]
  • visa, kas pasakyta apie paieškos operatorių galioja ir pakeitimo operatoriui
  • s yra būtinas
  • modifikatorius e nurodo, kad rastą tekstą reikia keisti pakaitale esančios išraiškos rezultatu, o ne literaliai ten esančiu tekstu.

    Masyvų apdorojimo funkcija grep

  • sintaksė
    grep išraiška, sąrašas
    grep blokas sąrašas
  • funkcijos rezultatas - sąrašas tų funkcijos argumentų, su kuriais išraiška buvo teisinga.
  • sąrašo elementai yra paduodami per specialų kintamąjį $_. Šis kintamasis gali būti keičiamas ir tai pakeis argumento sąrašo reikšmę. Primygtinai rekomenduojama nenaudoti šios galimybės. Ypač su programos kode įrašytais sąrašais.
  • pavyzdys:
    @foo = grep(!/^#/, @bar);
    rezultatas: masyve @foo bus tik tie masyvo @bar elementai, kurie prasidėjo ne # ženklu.

    Masyvų apdorojimo funkcija map

  • sintaksė
    map išraiška, sąrašas
    map blokas sąrašas
  • funkcijos rezultatas - sąrašas, gautas pritaikius išraišką kiekvienam argumentų sąrašo elementui.
  • sąrašo elementai yra paduodami per specialų kintamąjį $_. Šis kintamasis gali būti keičiamas ir tai pakeis argumento sąrašo reikšmę. Primygtinai rekomenduojama nenaudoti šios galimybės. Ypač su programos kode įrašytais sąrašais.
  • norint praleisti kažkurią argumentų sąrašo reikšmę reikėtų gražinti tuščią sąrašą (žr. pvz.)
  • pavyzdys:
    perl -e 'print join(":", map {$_ %2==0?$_:()} (1,2,3,4,5,6))'
    rezultatas: 2:4:6