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
|