Az m operátor a =~ vagy !~ operátorok valamelyike által
megadott füzért hasonlítja össze a reguláris kifejezéssel. A
visszatérési értéke skalár környezetben =~
használata esetén true, 1 ha a reguláris kifejezés megfelel a
füzérnek, illetve false, '' ha a reguláris kifejezés nem felel meg
a stringnek. !~ használata esetén fordítva.
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:
- g globális, nem csak egyszeri keresés
- i kis és nagybetûk egyenértékûek
- m a füzért többsorosnak tekinti
- o a reguláris kifejezést csak egyszer értékeli ki a Perl
- s a füzért egysorosnak tekinti a Perl
- x kiterjesztett reguláris kifejezésként értelmezi a Perl a megadott reguláris kifejezést
A határoló karakterek lehetnek bármilyen nem alfanumerikus, nem
szóköz jellegû karakterek, ha / jelet használunk, akkor nem kell
kiírni az m operátort. Ha olyan karaktert használunk
határoló karakternek, amely zárójel jellegû, akkor annak
párját kell használni a reguláris kifejezés
lezárására.
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öbbféleké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 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 azoknak a
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 miné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
|