s///g v kombinaci s (?<=)

David Olszyński hisaak na mendelu.cz
Čtvrtek Září 5 20:16:02 MEST 2002


Michal ©paček wrote:

> On Thu, Sep 05, 2002 at 11:24:59AM +0200, Pavel ©merk wrote:
> ahoj
>> $ perl -e '$a = "baa\n"; $a =~ s/(?<=b)a/b/g; print $a'
>> bba
>> Ocekaval jsem vystup bbb, myslel jsem si, ze nejprve se nahradi prvni a
>> a pak druhe a, kdyz to chci "Replace globally, i.e., all occurrences."
>> Jak tohle funguje a kde se o tom da docist (v perlre a perlop jsem nic
>> nenasel) -- perl si ten retezec nemeni pod rukama? Mel jsem za to, ze
>> (zhruba a vagne receno) se posunuje po retezci, pokud najde match,
>> nahradi a hleda dalsi match od mista, kde skoncil minuly, tady to ale
>> vypada, jako by to hledal na nejake RO kopii.
> Ja myslim, ze je to spravne, protoze on vybira "b", ktere nasleduje
> "a" pricemz to "a" nahradi. A potom uz nenajde dalsi "b", takze nemuze najit
> ani nasledujici "a".
> 
> perl -e '$a = "baba\n"; $a =~ s/(?<=b)a/b/g; print $a'
> bbbb

Spravne to je urcite, ale to zduvodneni mi dobre nepripada. Hleda se "a", 
kteremu predchazi "b" a ne naopak.

Ta volba /g sice znamena "pro vsechny vyskyty", ale tim se musi myslet "pro 
vsechny vyskyty v _puvodni_ hodnote".
Podle me se to proste nemuze delat "in place", protoze treba vec jako
$ perl -e '$a = "baa\n"; $a =~ s/(?<=b)/b/g; print "$a\n"'
by pak asi generovala sama "b" a nikoliv "bbaa", jak je tomu ve skutecnosti.

Ja si to vzdy predstavoval tak, ze se nejdriv najdou vsechny shody a na konci 
se vsechno najednou nahradi (i kdyz takto to Perl nejspis nedela, nevim).

Jisty si ale nejsem, protoze jsem to taky nikde nenasel.
Pokud by to nekdo vedel urcite a mel treba nejaky odkaz, byl bych moc rad.

hisaak



Daląí informace o konferenci Perl