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!
- 1188 megtekintés
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.]
- A hozzászóláshoz be kell jelentkezni
De itt az s/// rész szerintem nem azt fogja csinálni, amit a topicnyitó szeretne.
Csaba
- A hozzászóláshoz be kell jelentkezni
Szerintem se, de amíg nem látja az eredményt, addig nem is tudja kijavítani. Gondolom tanulni akar, és akkor jobb ha szenved vele egy kicsit :-)
- A hozzászóláshoz be kell jelentkezni
Ebben mondjuk igazad van :-)
Köszönöm a segítséget!
--
\\-- blog --//
- A hozzászóláshoz be kell jelentkezni
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);
- A hozzászóláshoz be kell jelentkezni
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 --//
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Na, amikor 20-30 KB-os scriptben már minden második sorom hasonlóképpen nézett ki, akkor szoktam le a perlről :)
- A hozzászóláshoz be kell jelentkezni
Nocsak, találtál valami még tömörebb nyelvet? Érdekelne a dolog. ;)
- A hozzászóláshoz be kell jelentkezni
targets_new << targ.gsub(/amit/, 'amire')
Ruby. Nem tomor, de legalabb normalisabban nez ki.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Ezért kell kommentelni....
Csaba
- A hozzászóláshoz be kell jelentkezni
Kommentelni lehet, de attól még ocsmány marad :-)
- A hozzászóláshoz be kell jelentkezni
De gustibus non est disputandum
... nekem speckó tetszik :-)
Csaba
- A hozzászóláshoz be kell jelentkezni