Weblabor - A kiindulopont webmestereknek
Leírások+Referenciák / Perl röviden / Helyettesítõ operátor

Az s operátor a =~ vagy !~ operátorok valamelyike által megadott füzért hasonlítja össze a reguláris kifejezéssel és az elsõ megtalált részfüzért kicseréli a megadott helyettesítõ füzérrel. Az operátor általános alakja

       $text =~ s{regexp}{helyett}egimosx

ahol a egimosx karakterek bármelyike opcióként használható és az operátor mûködését befolyásolja a következõképpen:

  • e a helyett értéket kifejezésként értelmezi a program
  • 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

Ha nem adnak meg semmilyen füzért a =~ vagy !~ operátorral, akkor a default $_ változót használja a Perl. A =~ vagy !~ operátorral megadott füzérnek balértéknek kell lennie, hiszen ezt a Perl módosítani akarja.

A határoló karakterek lehetnek bármilyen nem alfanumerikus, nem szóköz jellegû karakterek. Ha ' karaktert használunk, akkor a Perl nem interpolált füzérként értelmezi a reguláris kifejezést illetve a helyettesítõ füzért. (Kivéve ha az e opciót használjuk.) Határoló karakterként valamilyen zárójelet használva annak párját kell használni a reguláris kifejezés, vagy a helyettesítõ füzér lezárására. Nem feltétlenül kell ugyanazt a karakterpárt használni a reguláris kifejezéshez és a helyettesítõ füzérhez, de mind a kettõt külön be kell zárni, azaz

s/alma/körte/

három határoló karaktert használ, de

s(alma){korte}

négy határoló karaktert használ.

Ha a reguláris kifejezés üres füzér, akkor a legutoljára használt reguláris kifejezést használja a Perl.

Az operátor visszatérési értéke a sikeresen elvégzett cserék száma, illetve ha nem sikerült egyetlen cserét sem elvégeznie akkor false, '' üres füzér, illetve a !~ használata esetén ennek ellentéte. Precízebben ($x !~ ...) ugyanaz, mint (! $x =~ ...).

A opciók értelmezése hasonló, mint az m operátornál.

Az e opció esetén a program a helyettesítõ füzért, mint kifejezést értékeli ki, és ennek eredményét használja a helyettesítéshez. Ez egy teljes Perl kiértékelést jelent, úgy, mint az eval függvény használatánál, de a szintaktikus elemzés és ellenõrzés fordítási idõben történik.

A g opciónál a cseréket addig folytatja, amíg végig nem ér a füzéren, azaz

$t = "abbab" ;
$t =~ s/ab/aa/g;
print $t;

aminek a kimenete

aabaa

Ebbõl az is látszik, hogy a továbbkeresést onnan folytatja ahol az elõzõ csere végetért, azaz a helyettesítésként berakott füzért már nem bántja.

Ha nem használjuk a g opciót, akkor az operátor emlékszik arra, hogy hol fejezte be az elõzõ cserét, és onnan folytatja. Ezzel lehetõvé válik, hogy egy ciklussal ugyanazt a hatást érjük el, mint a g opcióval, de közben minden egyes csere után még a ciklus törzse is végrehajtódik:

$t = 'bababababababab' ;
$s = 'bab';
$r = 'bib';
while( $t =~ s/$s(.)/$r$1/ ){
  print $1;
  }
print "\n$t\n";

aminek a kimenete

aaaaaa
bibibibibibibab

Ha pedig a pos függvényt is bevetjük, akkor elérhetjük, hogy azokat a helyettesítõ füzéreket is figyelembe veszi az operátor, amelyeket az elõzõ csere alkalmával helyezett el a füzérben:

$t = 'bababababababab' ;
$T = $t;
$s = 'bab';
$r = 'bib';
$T =~ s/$s/$r/g;
while( $t =~ s/$s/$r/ ){
  pos($t) -= length($r);
  }
print "$T\n$t\n";

aminek a kimenete

bibabibabibabib
bibibibibibibib

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át az m operátornál mutatunk.

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át az m operátornál mutatunk.

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. Példát az m operátornál mutatunk.

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 minnél elõbb átmásolni õket. Ezeket a változókat lehet használni a helyettesítõ füzérben is. 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' ;
$i = 1;
$i++ while $t =~ s/(a|b|c)(.*)\1/$i/ ;
print "$t\n";

aminek a kimenete

123