Az m operátor

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: 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ö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 

Verhás Péter Home Page . . . . . . Perl röviden, tartalomjegyzék