Öt adatstruktúra található a nyelvben: skalár, skalárok tömbje, az asszociatív tömb, a Perl által hívható szubrutin, és a globális adattípus hivatkozás bármely ilyen nevű adattípusra. Ezeket - mint azt későbbiekben látni fogjuk - mutatókkal is lehet kombinálni, így lényegében mindenféle adatstruktúrát megalkothatunk. A normál tömbök indexe - általában - 0-val kezdődik (lásd még itt). Az asszociatív tömböket szövegekkel kell indexelni.
A változó nevének első karaktere határozza meg annak típusát:
Ez az első karakter a változónak a kifejezésben betöltött szerepét kell, hogy takarja.
Példák:
Az alprogramokat & jellel megjelölhetjük, ha az alprogramot deklarációja előtt szeretnénk használni, vagy az alprogram címét akarjuk egy változóban eltárolni. Függvényre a deklarációja után már a & szimbólum nélkül is hivatkozhatunk (ez - a nyelv előző verziójától eltérően - minden függvényre alkalmazható).
A változók nevei egyébként a típusuknak megfelelő külön szimbólumtáblába kerülnek, tehát használhatunk azonos nevu tömböt, asszociatív tömböt és skalárt. (Ekkor $ize[0] az @ize tömb része, nem pedig az $ize változót helyettesíti.)
A változók nevei betűvel vagy aláhúzásjellel kell, hogy kezdődjenek,
és tetszőleges alfanumerikus karakterrel, illetve aláhúzásjellel folytatható.
A változónevek érzékenyek a kis- és nagybetűs írásmódra.
A változó neve nem kell, hogy megadott legyen, akár egy kifejezés is
állhat helyette, melynek aktuális értéke lesz a valódi név!
Példa:
Vannak speciális változónevek alapvető paraméterek jelölésére. Ezek az Előre definiált változók részben megtalálhatóak.
Például az int(<STDIN>) eredménye egy egész szám lesz, amit a bemenet egy sorából állít elő az int függvény, de a sort(<STDIN>) eredménye egy lista lesz, amit a bemenet összes sorának beolvasása után a sort függvény rendezéssel állít elő!
Skalár változók sokféle értéket tárolhatnak: szám, szöveg, bináris adat vagy mutató. A tartalom a használat során mindig szükséges formára alakul, azaz kiírhatunk egy számot szövegként egy változóba, majd ezt a változót megszorozhatjuk kettővel.
Az alábbiakban lássunk néhány skalár értéket (literált):
A Perl saját magán belül az egészeket lebegőpontos számként ábrázolja. Ez azt jelenti, hogy egy egész skalár érték egy speciális lebegőpontos skalár érték. A Perl különbséget tesz " és ' között. Idézőjelek között elvégzi a változók és a speciális karakterek helyettesítését, apósztrófok között nem.
Továbbá lehetőségünk van idézőjelek között megadott szöveg esetén a ", $ és \ karakterek megadására, ezek elé elhelyezett \ karakterrel. Hasonló módon érhetjük el ezt aposztrófok közti karakterlánc esetében a \ és ' karakterekre.
Az aritmetikai műveleteknél a számok bináris formára konvertálódnak, így ezek pontosságát a processzor korlátozza. Vannak persze kiegészítő modulok tetszőleges pontosságú számok kezelésére is.
Feltételek vizsgálatánál csak az üres szöveg, illetve a 0 érték jelent hamisat. Tipp: ha valahol szükség van "0, de igaz" értékre, akkor ezt a "0+0E" stringgel érhetjük el. Ennek logikai értéke "igaz", viszont ha számolunk vele, akkor 0-vá konvertálódik.
A skalár változóknak alapvetően két állapota lehet: definiált, vagy definiálatlan. Ezeket a defined, illetve undefined függvényekkel kérdezhetjük le. Egy változó addig definiálatlan, amíg valaki nem ad neki értéket, vagy nem definiálja explicit módon. Definiálatlan változónak - a környezetétől függően - 0 vagy üres szöveg értéke van. Ha a Perl interpretert a "-w" kapcsolóval indítjuk (ez megadható pl. a script első sorában: #!/usr/local/bin/perl -w, windows esetén a perl -w filename.pl sort kell futtatni), akkor definiálatlan változóra való hivatkozás esetén figyelmeztetést kapunk.
A skaláris adatokkal a megszokott műveletek végezhetők a megszokott műveleti jelekkel. Ami eltérő lehet: a számok esetében a hatványozás művelet a ** műveleti jellel, a modulus a % jellel valamint a karakterekre a . összefűzés művelet, az összehasonlító (FORTRAN-szeru) eq, ne, lt, gt, le, ge, cmp műveletek és az ismétlő műveleti jel: x. Fontos beépített függvény a chomp, amely egy karakterlánc végéről levágja a \n jelet. A skalár változók a használat során mindig a megfelelő formára konvertálódnak, ezáltal írhatunk a műveleti jelek használatakor eltérő típusú változókat is egy kifejezésben.
Példák:
Megjegyzés:
A Perl-ben használt tömböket inkább indexelt listáknak kéne nevezni a kiterjeszthetőségük miatt.
Egy lista zárójelek közt felsorolt skalár értékeket jelent. A lista akármilyen hosszúságú lehet és tetszőleges skalár értéket tartalmazhat.
Értékadásokban (rész)tömböket is értékül adhatunk. Ezekben az esetekben a balérték listája az első elemtől kezdve addig töltődik fel, amíg van új elem a jobb oldalon. Az értékadás akkor és csak akkor érvényes, ha a baloldalon legális balértékek szerepelnek.
A $[ változó mutatja, hogy a tömbök melyik indexen kezdődnek ( ez a C-ben 0 ). Ennek értéke módosítható (bár módosítása ellenjavalt), ezért a következő két értékadás ekvivalens:
Skalár környezetben a tömb kiértékelése a tömb aktuális hosszát adja vissza:A hash változók is megegyeznek a skalároknál leírtakkal, csak % jellel kezdődnek. A hivatkozás {}-el történik.
A hash változókra a keys függvény a kulcsok listáját adja vissza, a values pedig az értékeket. delete-el lehet kulcs szerint törölni, az each függvény pedig ciklusokban jól használható, mivel végigmegy a hash-en visszaadva a kulcs-érték párokat. Az exists függvény használható annak tesztelésére, hogy egy adott kulcs szerepel-e a hash táblában.
Példák: hash.pl
A nyelvben az utasítások és deklarációk szabadon - akár keverve is, mint egy C++ programban - követhetik egymást. Megkötés csak az alprogramok hívására van: a még nem deklarált alprogramot csak a & szimbólum használatával lehet meghívni.
Egy utasítás után egy módosító kifejezés állhat, amely ennek az egyetlen utasításnak a hatását befolyásolja:
Egy üzenet kiírása feltételtől függően:
Ez alapján a lehetséges formák:
Vezérlésátadó utasítások:
last; : a ciklus végrehajtása megszakítódik és a vezérlés
a ciklust követő utasításra kerül.
next; : a ciklus aktuális iterációját befejezi és a következő iterációt indítja. redo; : az aktuális iterációt újraindítja. goto CIMKE; : a CIMKE címkéjű utasításra ugrik. |
CIMKE while ...
last CIMKE; : kilép a CIMKE címkéju ciklusból (példa). next CIMKE; : a CIMKE címkéju ciklus következő iterációját indítja. redo CIMKE; : a CIMKE címkéju ciklus aktuális iterációját újraindítja. |
A switch utasításra nincs külön forma, de van rá egypár lehetséges más megoldás, például:
Van két speciális eset, ami pont úgy néz ki, mintha blokk lenne, de mégis egyetlen egyszerű utasításnak minősül. Az egyik a már korábban is említett do, a másik a (többek között) kivételkezelésre használt eval:
|
|
|
lista (,) | balról jobbra | kifejezések listája |
-> | balról jobbra | hivatkozás |
++,-- | nem asszociatív | növelés, csökkentés |
** | jobbról balra | hatványozás |
!, ~, \ és unáris +, - | jobbról balra | nem, bináris nem, címoperátor, +, - |
=~, !~ | balról jobbra | szöveg illeszkedés, nem illeszkedés |
*, /, %, x | balról jobbra | szorzás, osztás, modulus, ismétlés |
+, -, . | balról jobbra | összeadás, kivonás, konkatenáció |
<<, >> | balról jobbra | balra, illetve jobbra shift |
unáris operátorok | nem asszociativ | pl. file tesztelés: -f |
<, >, <=, >=, =, lt, gt, le, ge | nem asszociatív | szám illetve szöveg összehasonlítása |
==, !=, <=>, eq, ne, cmp | nem asszociatív | szám illetve szöveg összehasonlítása |
& | balról jobbra | bináris AND |
|, ^ | balról jobbra | bináris OR és XOR |
&& | balról jobbra | logikai AND |
|| | balról jobbra | logikai OR |
.. | nem asszociatív | tartomány |
?: | jobbról balra | feltételes értékadás |
=, +=, -=, *= ... | jobbról balra | értékadás operátorai |
, => | balról jobbra | vessző és kulcs operátor |
lista operátorok | nem asszociatív | lista manipulációk |
not | balról jobbra | logikai NOT |
and | balról jobbra | logikai AND |
or, xor | balról jobbra | logikai OR, eXclusive OR |
|
|
|
= | $a = "Valami szöveg\n"; | egyszerű értékadás |
+= | $szam += 2; | $szam = $szam+2; |
-= | $szam -= 2; | $szam = $szam-2; |
.= | $string .= "még valami"; | $string = $string . "még valami"; |
*= | $szorzat *= 3; | $szorzat = $szorzat * 3; |
/= | $valos /= 5; | $valos = $valos / 5; |
%= | $mod %= 2; | $mod = $mod % 2; |
x= | $string x= 5; | $string = $szting x 5; |
|= | $a |= $b; | $a = $a | $b; |
^= | $a ^= $b; | $a = $a ^ b; |
<<= | $a <<= $b; | $a = $a << $b; |
>>= | $a >>= $b; | $a = $a >> $b; |
&&= | $a &&= $b; | $a = $a && $b; |
||= | $a ||= $b; | $a = $a || $b; |
Itt csak az ismeretlennek tunő operátorokat fogom kiemelni:
|
|
|
lista (,) | balról jobbra | kifejezések listája |
-> | balról jobbra | hivatkozás |
++,-- | nem asszociatív | növelés, csökkentés |
** | jobbról balra | hatványozás |
!, ~, \ és unáris +, - | jobbról balra | nem, bináris nem, címoperátor, +, - |
=~, !~ | balról jobbra | szöveg illeszkedés, nem illeszkedés |
*, /, %, x | balról jobbra | szorzás, osztás, modulus, ismétlés |
+, -, . | balról jobbra | összeadás, kivonás, konkatenáció |
<<, >> | balról jobbra | balra, illetve jobbra shift |
unáris operátorok | nem asszociativ | pl. file tesztelés: -f |
<, >, <=, >=, =, lt, gt, le, ge | nem asszociatív | szám illetve szöveg összehasonlítása |
==, !=, <=>, eq, ne, cmp | nem asszociatív | szám illetve szöveg összehasonlítása |
& | balról jobbra | bináris AND |
|, ^ | balról jobbra | bináris OR és XOR |
&& | balról jobbra | logikai AND |
|| | balról jobbra | logikai OR |
.. | nem asszociatív | tartomány |
?: | jobbról balra | feltételes értékadás |
=, +=, -=, *= ... | jobbról balra | értékadás operátorai |
, => | balról jobbra | vessző és kulcs operátor |
lista operátorok | nem asszociatív | lista manipulációk |
not | balról jobbra | logikai NOT |
and | balról jobbra | logikai AND |
or, xor | balról jobbra | logikai OR, eXclusive OR |
|
|
|
= | $a = "Valami szöveg\n"; | egyszerű értékadás |
+= | $szam += 2; | $szam = $szam+2; |
-= | $szam -= 2; | $szam = $szam-2; |
.= | $string .= "még valami"; | $string = $string . "még valami"; |
*= | $szorzat *= 3; | $szorzat = $szorzat * 3; |
/= | $valos /= 5; | $valos = $valos / 5; |
%= | $mod %= 2; | $mod = $mod % 2; |
x= | $string x= 5; | $string = $szting x 5; |
|= | $a |= $b; | $a = $a | $b; |
^= | $a ^= $b; | $a = $a ^ b; |
<<= | $a <<= $b; | $a = $a << $b; |
>>= | $a >>= $b; | $a = $a >> $b; |
&&= | $a &&= $b; | $a = $a && $b; |
||= | $a ||= $b; | $a = $a || $b; |
Itt csak az ismeretlennek tűnő operátorokat fogom kiemelni:
általában | hivatalos jelölés | értelme | megjegyzés |
---|---|---|---|
'...' | q{} | szöveg literál | ez a "szó szerinti" szöveg literál |
"..." | qq{} | szöveg literál | változókat helyettesíti a szövegben (pl. "$a", "\n") |
`...` | qx{} | parancs | az adott szöveget, mint egy shell parancssort végrehajtja |
qw{} | a szövegből egy szólistát csinál | pl.: paraméterátadás | |
// | m{} | mintaillesztés | változókat értékükkel helyettesíti |
s// | s{}{} | csere | változókat értékükkel helyettesíti |
tr{}{} | betucsere | a szövegeket mint cseretáblát használja |
Példák:
|
|
|
lista (,) | balról jobbra | kifejezések listája |
-> | balról jobbra | hivatkozás |
++,-- | nem asszociatív | növelés, csökkentés |
** | jobbról balra | hatványozás |
!, ~, \ és unáris +, - | jobbról balra | nem, bináris nem, címoperátor, +, - |
=~, !~ | balról jobbra | szöveg illeszkedés, nem illeszkedés |
*, /, %, x | balról jobbra | szorzás, osztás, modulus, ismétlés |
+, -, . | balról jobbra | összeadás, kivonás, konkatenáció |
<<, >> | balról jobbra | balra, illetve jobbra shift |
unáris operátorok | nem asszociativ | pl. file tesztelés: -f |
<, >, <=, >=, =, lt, gt, le, ge | nem asszociatív | szám illetve szöveg összehasonlítása |
==, !=, <=>, eq, ne, cmp | nem asszociatív | szám illetve szöveg összehasonlítása |
& | balról jobbra | bináris AND |
|, ^ | balról jobbra | bináris OR és XOR |
&& | balról jobbra | logikai AND |
|| | balról jobbra | logikai OR |
.. | nem asszociatív | tartomány |
?: | jobbról balra | feltételes értékadás |
=, +=, -=, *= ... | jobbról balra | értékadás operátorai |
, => | balról jobbra | vessző és kulcs operátor |
lista operátorok | nem asszociatív | lista manipulációk |
not | balról jobbra | logikai NOT |
and | balról jobbra | logikai AND |
or, xor | balról jobbra | logikai OR, eXclusive OR |
|
|
|
= | $a = "Valami szöveg\n"; | egyszerű értékadás |
+= | $szam += 2; | $szam = $szam+2; |
-= | $szam -= 2; | $szam = $szam-2; |
.= | $string .= "még valami"; | $string = $string . "még valami"; |
*= | $szorzat *= 3; | $szorzat = $szorzat * 3; |
/= | $valos /= 5; | $valos = $valos / 5; |
%= | $mod %= 2; | $mod = $mod % 2; |
x= | $string x= 5; | $string = $szting x 5; |
|= | $a |= $b; | $a = $a | $b; |
^= | $a ^= $b; | $a = $a ^ b; |
<<= | $a <<= $b; | $a = $a << $b; |
>>= | $a >>= $b; | $a = $a >> $b; |
&&= | $a &&= $b; | $a = $a && $b; |
||= | $a ||= $b; | $a = $a || $b; |
Itt csak az ismeretlennek tűnő operátorokat fogom kiemelni:
általában | hivatalos jelölés | értelme | megjegyzés |
---|---|---|---|
'...' | q{} | szöveg literál | ez a "szó szerinti" szöveg literál |
"..." | qq{} | szöveg literál | változókat helyettesíti a szövegben (pl. "$a", "\n") |
`...` | qx{} | parancs | az adott szöveget, mint egy shell parancssort végrehajtja |
qw{} | a szövegből egy szólistát csinál | pl.: paraméterátadás | |
// | m{} | mintaillesztés | változókat értékükkel helyettesíti |
s// | s{}{} | csere | változókat értékükkel helyettesíti |
tr{}{} | betucsere | a szövegeket mint cseretáblát használja |
Példák:
Szövegkeresés netovábbja.
|
|
|
lista (,) | balról jobbra | kifejezések listája |
-> | balról jobbra | hivatkozás |
++,-- | nem asszociatív | növelés, csökkentés |
** | jobbról balra | hatványozás |
!, ~, \ és unáris +, - | jobbról balra | nem, bináris nem, címoperátor, +, - |
=~, !~ | balról jobbra | szöveg illeszkedés, nem illeszkedés |
*, /, %, x | balról jobbra | szorzás, osztás, modulus, ismétlés |
+, -, . | balról jobbra | összeadás, kivonás, konkatenáció |
<<, >> | balról jobbra | balra, illetve jobbra shift |
unáris operátorok | nem asszociativ | pl. file tesztelés: -f |
<, >, <=, >=, =, lt, gt, le, ge | nem asszociatív | szám illetve szöveg összehasonlítása |
==, !=, <=>, eq, ne, cmp | nem asszociatív | szám illetve szöveg összehasonlítása |
& | balról jobbra | bináris AND |
|, ^ | balról jobbra | bináris OR és XOR |
&& | balról jobbra | logikai AND |
|| | balról jobbra | logikai OR |
.. | nem asszociatív | tartomány |
?: | jobbról balra | feltételes értékadás |
=, +=, -=, *= ... | jobbról balra | értékadás operátorai |
, => | balról jobbra | vessző és kulcs operátor |
lista operátorok | nem asszociatív | lista manipulációk |
not | balról jobbra | logikai NOT |
and | balról jobbra | logikai AND |
or, xor | balról jobbra | logikai OR, eXclusive OR |
|
|
|
= | $a = "Valami szöveg\n"; | egyszerű értékadás |
+= | $szam += 2; | $szam = $szam+2; |
-= | $szam -= 2; | $szam = $szam-2; |
.= | $string .= "még valami"; | $string = $string . "még valami"; |
*= | $szorzat *= 3; | $szorzat = $szorzat * 3; |
/= | $valos /= 5; | $valos = $valos / 5; |
%= | $mod %= 2; | $mod = $mod % 2; |
x= | $string x= 5; | $string = $szting x 5; |
|= | $a |= $b; | $a = $a | $b; |
^= | $a ^= $b; | $a = $a ^ b; |
<<= | $a <<= $b; | $a = $a << $b; |
>>= | $a >>= $b; | $a = $a >> $b; |
&&= | $a &&= $b; | $a = $a && $b; |
||= | $a ||= $b; | $a = $a || $b; |
Itt csak az ismeretlennek tűnő operátorokat fogom kiemelni:
általában | hivatalos jelölés | értelme | megjegyzés |
---|---|---|---|
'...' | q{} | szöveg literál | ez a "szó szerinti" szöveg literál |
"..." | qq{} | szöveg literál | változókat helyettesíti a szövegben (pl. "$a", "\n") |
`...` | qx{} | parancs | az adott szöveget, mint egy shell parancssort végrehajtja |
qw{} | a szövegből egy szólistát csinál | pl.: paraméterátadás | |
// | m{} | mintaillesztés | változókat értékükkel helyettesíti |
s// | s{}{} | csere | változókat értékükkel helyettesíti |
tr{}{} | betucsere | a szövegeket mint cseretáblát használja |
Példák:
Szövegkeresés netovábbja.
i | kis- és nagybetuket nem különbözteti meg |
m | többsoros szövegben keres |
s | a szöveget egyetlen sorként kezeli |
x | kibővített reguláris kifejezések használata |
g | összes találat megkeresése |
c | a g módosító használatakor sikertelen keresés esetén ne nullázza a keresési pozíciót |
o | csak egyszer fordítsa le a kifejezést, ne minden kiértékeléskor |
i | kis- és nagybetuket nem különbözteti meg |
m | a szöveget többsorosként kezeli |
s | a szöveget egyetlen sorként kezeli |
x | a szóközt figyelmen kívül hagyja a mintában |
g | a minta összes előfordulását cseréli |
c | a g módosító használatakor sikertelen keresés esetén ne nullázza a keresési pozíciót |
o | csak egy kiértékelést végez |
e | a helyettesítő stringet kifejezésként értékeli |
s | kicseréli a többszörösen azonos kimenő karaktereket egy karakterre |
c | az összes nem meghatározott karaktert fordítja |
d | törli az összes meghatározott karaktert |
Az i módosító használatával így a /perl/i kifejezés
a PeRL szövegre is illeszkedni fog.
Egy ilyen kifejezésben egy szöveghez illeszthető mintát lehet leírni. Ebbe
a mintába persze belevehetünk extra dolgokat is, hogy a nekünk szükséges
részt nyerjük ki a szövegből. (A UNIX grep parancsában megszokott
dolgok a () csoportosító operátortól eltekintve.)
A C nyelvben érvényes szabályok érvényesek, és még van egypár - shell script-ekből
ismerős - új operátor.
|
|
|
lista (,) | balról jobbra | kifejezések listája |
-> | balról jobbra | hivatkozás |
++,-- | nem asszociatív | növelés, csökkentés |
** | jobbról balra | hatványozás |
!, ~, \ és unáris +, - | jobbról balra | nem, bináris nem, címoperátor, +, - |
=~, !~ | balról jobbra | szöveg illeszkedés, nem illeszkedés |
*, /, %, x | balról jobbra | szorzás, osztás, modulus, ismétlés |
+, -, . | balról jobbra | összeadás, kivonás, konkatenáció |
<<, >> | balról jobbra | balra, illetve jobbra shift |
unáris operátorok | nem asszociativ | pl. file tesztelés: -f |
<, >, <=, >=, =, lt, gt, le, ge | nem asszociatív | szám illetve szöveg összehasonlítása |
==, !=, <=>, eq, ne, cmp | nem asszociatív | szám illetve szöveg összehasonlítása |
& | balról jobbra | bináris AND |
|, ^ | balról jobbra | bináris OR és XOR |
&& | balról jobbra | logikai AND |
|| | balról jobbra | logikai OR |
.. | nem asszociatív | tartomány |
?: | jobbról balra | feltételes értékadás |
=, +=, -=, *= ... | jobbról balra | értékadás operátorai |
, => | balról jobbra | vessző és kulcs operátor |
lista operátorok | nem asszociatív | lista manipulációk |
not | balról jobbra | logikai NOT |
and | balról jobbra | logikai AND |
or, xor | balról jobbra | logikai OR, eXclusive OR |
|
|
|
= | $a = "Valami szöveg\n"; | egyszerű értékadás |
+= | $szam += 2; | $szam = $szam+2; |
-= | $szam -= 2; | $szam = $szam-2; |
.= | $string .= "még valami"; | $string = $string . "még valami"; |
*= | $szorzat *= 3; | $szorzat = $szorzat * 3; |
/= | $valos /= 5; | $valos = $valos / 5; |
%= | $mod %= 2; | $mod = $mod % 2; |
x= | $string x= 5; | $string = $szting x 5; |
|= | $a |= $b; | $a = $a | $b; |
^= | $a ^= $b; | $a = $a ^ b; |
<<= | $a <<= $b; | $a = $a << $b; |
>>= | $a >>= $b; | $a = $a >> $b; |
&&= | $a &&= $b; | $a = $a && $b; |
||= | $a ||= $b; | $a = $a || $b; |
Itt csak az ismeretlennek tűnő operátorokat fogom kiemelni:
általában | hivatalos jelölés | értelme | megjegyzés |
---|---|---|---|
'...' | q{} | szöveg literál | ez a "szó szerinti" szöveg literál |
"..." | qq{} | szöveg literál | változókat helyettesíti a szövegben (pl. "$a", "\n") |
`...` | qx{} | parancs | az adott szöveget, mint egy shell parancssort végrehajtja |
qw{} | a szövegből egy szólistát csinál | pl.: paraméterátadás | |
// | m{} | mintaillesztés | változókat értékükkel helyettesíti |
s// | s{}{} | csere | változókat értékükkel helyettesíti |
tr{}{} | betucsere | a szövegeket mint cseretáblát használja |
Példák:
Szövegkeresés netovábbja.
i | kis- és nagybetuket nem különbözteti meg |
m | többsoros szövegben keres |
s | a szöveget egyetlen sorként kezeli |
x | kibővített reguláris kifejezések használata |
g | összes találat megkeresése |
c | a g módosító használatakor sikertelen keresés esetén ne nullázza a keresési pozíciót |
o | csak egyszer fordítsa le a kifejezést, ne minden kiértékeléskor |
i | kis- és nagybetuket nem különbözteti meg |
m | a szöveget többsorosként kezeli |
s | a szöveget egyetlen sorként kezeli |
x | a szóközt figyelmen kívül hagyja a mintában |
g | a minta összes előfordulását cseréli |
c | a g módosító használatakor sikertelen keresés esetén ne nullázza a keresési pozíciót |
o | csak egy kiértékelést végez |
e | a helyettesítő stringet kifejezésként értékeli |
s | kicseréli a többszörösen azonos kimenő karaktereket egy karakterre |
c | az összes nem meghatározott karaktert fordítja |
d | törli az összes meghatározott karaktert |
Az i módosító használatával így a /perl/i kifejezés a PeRL szövegre is illeszkedni fog. Egy ilyen kifejezésben egy szöveghez illeszthető mintát lehet leírni. Ebbe a mintába persze belevehetünk extra dolgokat is, hogy a nekünk szükséges részt nyerjük ki a szövegből. (A UNIX grep parancsában megszokott dolgok a () csoportosító operátortól eltekintve.)
\ | a következő karakter speciális jelentését elveszti |
^ | a sor elejéhez illeszkedik |
. | egy tetszőleges karakterhez illeszkedik (kivéve az újsort) |
$ | sor végéhez illeszkedik |
| | alternatívák jelölése |
() | csoportosítás |
[] | karakter-osztály kijelölése |
A . csak akkor fog az újsor karakterhez illeszkedni, ha erre az s módosítóval külön megkérjük, pl.:
* | 0 vagy több |
+ | 1 vagy több |
? | 0 vagy 1 |
{n} | pontosan n-szer |
{n,} | legalább n-szer |
{n,m} | legalább n-szer, de legfeljebb m-szer |
Alapértelmezés szerint az (n,m) esetén a leghosszabb ismétlődés fog illeszkedni ezekhez a részekhez. Ha minimális számú illeszkedést szeretnénk, akkor mindegyik után odatehetjük a ? jelet:
\t | tabulátorjel |
\n | újsor (New Line) |
\r | kocsi vissza (Carriage Return) |
\f | lapdobás (Form Feed) |
\v | vertical tab |
\a | csengő |
\e | escape |
\033 | oktális számrendszerben megadott karakter |
\x1b | karakter hexadecimálisan |
\c[ | kontrol karakter |
\l | kisbetu |
\u | nagybetu |
\L | kisbetu \E-ig |
\U | nagybetu \E-ig |
\E | kisbetu/nagybetu módosítás vége |
\Q | metakarakterek letiltása \E-ig |
\w | "szó" karakter (alfanumerikus és _) |
\W | nem-szó karakter |
\s | whitespace |
\S | nem whitespace |
\d | számjegy |
\D | nem számjegy |
\b | szóhatárhoz illeszkedik |
\B | nem szóhatár |
\A | string elejéhez illeszkedik |
\Z | string vége vagy az előtte levő újsor karakter |
\z | string vége |
\G | oda illeszkedik, ahol az előző illesztés véget ért |
A szóhatár (\b) olyan pont két karakter között, aminek egyik oldalán \w, a másik oldalán \W karakter áll (tetszőleges sorrendben). A \A és a \Z ugyanolyan, mint a ^ ill. a $, de az m módosító használatakor is csak egyszer illeszkednek (a ^ ill. a $ többször is illeszkedhet). Ha a szöveg végi újsor karaktert nem akarjuk eldobni, akkor a \z-t kell használni. A \G akkor jó, amikor a g módosító használatával az összes egyezést meg akarjuk keresni.
Az x módosító használatával még lehet használni más dolgokat is, de ezek szerintem már csak igen-igen ritkán kerülnek elő (pl. a bonyolult kifejezéseket fel lehet darabolni, hogy könnyebben olvashatóak legyenek, megjegyzéseket lehet írni a kifejezés közepébe stb.).
Ellentétben a // operátorral csak egyszer illeszti
az adott mintát a szöveghez.
$string = " ... egy fertály óra alatt kiseperte
a vályogkunyhót.";
if $string =~ ?fertály {
print "Mi a fertály?\n";
}
Főleg ciklusokban használjuk ahol a mintaillesztés
eredményét felszeretnénk használni a ciklusból való kilépés után.
while($input=<SDTIN>){
print $input;
if ($input =~ ?\bv\b? {last}
reset;
}
A reset hatására a ?? mintaillesztő újra lefut
egészen addig amíg az inputról be nem olvas egy v-ét. (/b jelzi, hogy minta
határáig nézi szöveget, vagyis v olvasásakor kilép a ciklusból).
Egy pár hasznos szabályos kifejezés mintaillesztére:
Nem használ szabályos kifejezést hanem simán megvizsgál
egy stringet egy megadott karakterlistát keresve és ezt egy másik, előre
megadott karakterlistára cseréli fel.
tr/KeresettLista/CsereLista/
Példa egy szöveg kisbetus karaktereit nagybetusre
váltjuk át:
$string="Itt az ideje, hogy minden jóravaló
ember hazatérjen!";
$string=tr/a-z/A-Z/;
$ek_szama=tr/e/e/;
#megszámolja az e-ék számát
a $stringben. és ezt az értéket adja át az ek_szama változónak.
Abban az esetben, ha a cserélendő lista hosszabb
mint a helyettesítő lista, akkor a helyettesítő lista utolsó elem ismétlődni
fog.
$_="12345678";
tr/5678/123;
print $_
#eredménye: 12341233
Példa: tr.pl
Nem használ szabályos kifejezést hanem simán megvizsgál
egy stringet egy megadott karakterlistát keresve és ezt egy másik, előre
megadott karakterlistára cseréli fel.
tr/KeresettLista/CsereLista/
Példa egy szöveg kisbetűs karaktereit nagybetűsre
váltjuk át:
$string="Itt az ideje, hogy minden jóravaló
ember hazatérjen!";
$string=tr/a-z/A-Z/;
$ek_szama=tr/e/e/;
#megszámolja az e-ék számát
a $stringben. és ezt az értéket adja át az ek_szama változónak.
Abban az esetben, ha a cserélendő lista hosszabb
mint a helyettesítő lista, akkor a helyettesítő lista utolsó elem ismétlődni
fog.
$_="12345678";
tr/5678/123;
print $_
#eredménye: 12341233
Példa: tr.pl
A Perl még sok érdekességet tud mintaillesztésben, ha az előzőeknél többre van szükség, vegyük elő a dokumentációt. Következzen most egy bonyolultabb példa: van-e a szövegben 'aaaa', és ha igen, hány darab 'a' betű van még előttük? Figyelem, a megoldás egyetlen minta!