Ha nem adnak meg semmilyen füzért a =~ operátorral, akkor a default $_ változót
használja a Perl. Az operátor általános alakja
$text =~ m{regexp}gimosx
ahol a gimosx karakterek bármelyike opcióként használható és az operátor működését befolyásolja
a következőképpen:
A reguláris kifejezést a Perl, mint interpolált füzért értelmezi és ha ennek kiértékelése üres füzért eredményez, akkor a legutoljára használt reguláris kifejezést használja a Perl.
Ennek megfelelően a regexp tartalmazhat változókra való hivatkozást, de vigyázni kell, mert a például $/ könnyen úgy értelmezhető, mint a reguláris kifejezést lezáró per jel.
Lista környezetben a visszatérési értéke egy olyan lista, amelynek elemei a kifejezésben
bezárójelezett részek, például
@k = "abbabaa" =~ m/(bb).+(a.)/;
print $#k;
print ' ',$k[0],' ',$k[1],"\n";
aminek kimenete
1 bb aa
Ha nem volt sikeres a keresés, akkor üres listát ad vissza az operátor, ha pedig sikeres volt,
de nem használtunk zárójeleket, akkor (1) értéket ad vissza.
A opciók értelmezése hasonló, mint az s operátornál.
A g opció használata esetén a nem csak egyszeri keresést több féle képpen is lehet értelmezni
a környezettől függően. Lista környezetben addig keres, ameddig a füzér végére nem ér, és a
bezárójelezett részeket rakja össze egy listába, például
@k = "abbabaa" =~ m/(ab)(b|a)/g;
print $#k;
print ' ',$k[0],' ',$k[1],' ',$k[2],' ',$k[3],"\n";
aminek kimenete
3 ab b ab a
Skaláris környezetben a g módosító hatására minden egyes végrehajtásnál tovább keres az operátor
és mindaddíg, amíg talál true értéket ad vissza, és amikor nem talál, akkor false értéket
ad vissza, például
$t = "abbabaa";
while( $t =~ m/(ab)(b|a)/g ){
print pos($t)," $1 $2\n";
}
aminek kimenete
3 ab b
6 ab a
Más szavakkal ilyen esetben az operátor megjegyzi, hogy hol tartott. Ezt a pozíciót egyébként a pos
fügvénnyel le is lehet kérdezni.
Az i opció megadása esetén a mintaillesztés során a kis és nagybetűket egyenértékűnek tekinti a nyelv. Ez alól kivételek az ékezetes magyar betűk, amelyeket a rendszer nem tekint betünek, csak akkor, ha a megfelelő POSIX setlocale fügvénnyel be lett állítva a nyelv.
Az m opció esetén a füzért többsorosnak tekinti a rendszer, ami praktikusan annyit jelent,
hogy minden sor végét meg lehet találni a $ jellel, ami a reguláris kifejezésben a sor vagy a füzér
végét jelenti, és hasonlóan minden sor elejét a ^ jellel.
Ennek az ellentéte a s opció, amely esetben a füzért egysorosnak
tekinti a Perl, és a $ csak a füzér végét fogja megtalálni, vagy a füzér végén álló
soremelést a ^ jel pedig csak a füzér elejét úgy, mintha sem az s sem pedig a m
opciót nem adtuk volna meg. Az s opció igazi értelme, hogy ennek megadásakor a
reguláris kifejezésekben
a . pont karakter megfelel a soremelés karaktereknek is, míg enélkül az opció
nélkül ezeknek a karaktereknek nem felel meg ez a metakarakter.
Például
$t = "allah\narab";
while( $t =~ /a(.)$/mg ){
print $1;
}print "\n";
while( $t =~ /a(.)$/sg ){
print $1;
}print "\n";
while( $t =~ /a(.)$/g ){
print $1;
}
kimenete
hb
b
b
Az o opció használata esetén a reguláris kifejezést csak egyszer értékeli ki a Perl futtató
rendszer a script futása során, és ha szerepel benne olyan változó, amelynek az értéke a későbbiek során
megváltozik, az nem fogja érdekelni a Perl-t. Például
$t = "allah arab";
$a = 'allah'; $b = 'rab';
&q;&p;
$b = 'szabad';
&q;&p;
sub q { print ' q',$t =~ /$a\sa$b/o }
sub p { print ' p',$t =~ /$a\sa$b/ }
kimenete
q1 p1 q1 p
Az x opció használatakor a Perl a reguláris kifejezést kiterjesztett értelemben használja, ami
azt jelenti, hogy ilyenkor a szóközöket csak akkor veszi figyelembe ha azok előtt \ karakter
van. Egyébként úgy tekinti, mint olyan karakter, amely arra való, hogy olvashatóbb legyen a program.
Ebben az esetben a Perl megjegyzés karakterét a # karaktert is megjegyzés kezdetének
tekinti a program, így az első példánkat írhatjuk
@k = "abbabaa" =~ m/(bb) #két darab 'b' bekerül $1-be
.+ #egy vagy több bármilyen karakter
(a.) #egy 'a' betű és pontosan egy bármilyen karakter
/x; #szóköz és megjegyzés engedélyezve
print $#k;
print ' ',$k[0],' ',$k[1],"\n";
alakban is. Ellenőrizzük, tényleg ugyanazt írta ki:
1 bb aa
Ha a reguláris kifejezésen belül zárójeleket használunk, akkor a $1, $2 ... változók
felveszik azoknaka részfüzéreknek az értékeit, amelyek a zárójelek között vannak. Ezek a $1,
$2 ... változók a blokk végéig, vagy a következő reguláris kifejezés kiértékeléséig használhatók.
Ajánlatos minnél előbb átmásolni őket. Ugyanezekre a részfüzérekre lehet hivatkozni már a reguláris
kifejezésen belül is, amennyiben valamilyen ismétlődést akarunk megkövetelni, például
$t = 'aegyabkettőbcháromc' ;
while( $t =~ m/(a|b|c)(.*)\1/g ){
print "$2 ";
}
aminek a kimenete
egy kettő három