Perl regexp segítségkérés

Sziasztok!

Van egy ilyen kódrészletem perlben.


foreach my $x (@symlinks){
$link=`readlink $x`;
....
push(@targets_new,$link=~s/akarmi-.{3, }-$src/-$dst/g);
....
}

A @symlinks tömb szimlinkeket tartalmaz, ezek célpontjait szeretném egy másik tömbbe (@targets_new) felvinni úgy, hogy közben szeretném kicserélni egy bizonyos részüket $src-ről $dst-re, melyek két tetszőlegesen választott sztringet reprezentálnak.

Egy példa: akarmi-2.3-alpha -> akarmi-2.3-beta. A két "-" jel közt legalább 3 karakter forduljon elő.
Amit írtam regexpet lefut ugyan de semmit nem ad vissza.

Ha csak simán "=~s/$src/$dst/g" regexpet használok, akkor három darab 1-est kapok a @targets_new tömmbe.
Nem tudom, hogy lehetne "egy művelettel" lecserélni és rögtön be is rakni az új tömbbe a módosított változó értékeket?

Alternatív megoldás is érdekel.

Előre is köszönöm!

Hozzászólások

> akkor három darab 1-est kapok a @targets_new tömmbe.

http://perldoc.perl.org/perlop.html#Binding-Operators

"When used in scalar context, the return value generally indicates the success of the operation."

http://perldoc.perl.org/perlretut.html

"If there is a match, s/// returns the number of substitutions made, otherwise it returns false."

http://perldoc.perl.org/perlop.html#Comma-Operator

"In scalar context it evaluates its left argument, throws that value away, then evaluates its right argument and returns that value."

> hogy lehetne "egy művelettel" lecserélni és rögtön be is rakni az új tömbbe a módosított változó értékeket?

Ezek szerint:


  push( @targets_new, scalar( $link=~s/akarmi-.{3, }-$src/-$dst/g, $link ) );

[Nem próbáltam ki.]

Pedig a második megoldás jó, csak a replace-t és a push-t szét kell bontani amiatt, amit előttem zamboriz írt.
szóval:


$link=~s/$src/$dst/g;
push(@targets_new,$link);

Csaba

Igen ez a variáció jó ebben a formában is és a scalar formában is, ahogy zamboriz írta.
Viszont maga az eredeti reguláris kifejezésem nem jó valamiért, azt még csiszolnom kell. :(
SZERK: látom elírtam. nembaj, ahogy látom bőven elég lesz nekem az egyszerűbb is.

Ha jól értettem akkor egy menetben csak a scalar függvénnyel lehet megoldani, mert skaláris környezetben csak a művelet sikerességét jelzi ki? (http://perldoc.perl.org/functions/scalar.html)
Ma is tanultam valami újat :)

--
\\-- blog --//

Azért ha nagyon szeretnéd, meg lehet oldani egy lépésben is (mit nem a perlben? ;). Kevésbé magától értetődő, de okulásnak az is jó.


($targets_new[$#targets_new+1] = $link) =~ s/amit/amire/;

Valójában ez is két lépésben dolgozik: a link értékét a tömbhöz vágja, és az új elemben cserél.
Valószínűleg - mivel tömelemen végez műveletet, és nem skaláron, amelyet aztán tömhöz csatol - nagy mennyiségű műveletnél kiderülne, hogy lassabb, mint a klasszikus kétlépéses magoldás.