Sziasztok!
Belefutottam egy hibába egy hosszabb Perl script írása során, az alábbi kódon is reprodukálható:
@tomb = ("alma", "korte", "barack");
$text = "Szeretem a %gyumolcs%-t";
foreach $gyumolcs (@tomb) {
print $gyumolcs."\n";
$text =~ s/%gyumolcs%/$gyumolcs/g;
print $text."\n";
print $gyumolcs."\n";
}
Ennek a kimenete a következő:
alma
Szeretem a alma-t
alma
korte
Szeretem a alma-t
korte
barack
Szeretem a alma-t
barack
Ugyanez a kimenet akkor is, ha a foreach loop-ot így írom:
foreach (@tomb) {
print $_."\n";
$text =~ s/%gyumolcs%/$_/g;
print $text."\n";
print $_."\n";
}
Mit csinálok rosszul?
Petya
- 1039 megtekintés
Hozzászólások
Attól függ mit szeretnél csinálni. Inkább azt fejtsd ki és talán segít(?:(?:ek)|(?: valaki)).
Először is:
use strict;
use warnings;
Majd:
Ha jól látom, akkor szimplán lecseréled a $text változó értékét egyszer alma-ra, majd a következő lefutásnál a $text változóban nyilván már nincs %gyumolcs%, hanem csak 'alma'. Ezek után nem fogja neked a következő gyümölcs nevére cserélni sehogy sem.
perl -le 'print "Szeretem a".((/^a/)?"z":"")." $_"."t!"for(qw/almá körté baracko/)'
- A hozzászóláshoz be kell jelentkezni
$text =~ s/%gyumolcs%/$gyumolcs/g;
print $text."\n";
=>
$_ = $text;
s/%gyumolcs%/$gyumolcs/g;
print $_."\n";
- A hozzászóláshoz be kell jelentkezni
Köszönöm, és bocs a hülye topicért, ez az eredménye, ha az ember hajnalban, fáradtam próbál kódolni...
Reggel mikor felkeltem, eszembe is jutott, hogy marha voltam, mivel az első replace esetén már kicserélni a változót, értelemszerűen utána már nem lesz mit cserélni...
Megyek és megpörgetem a lamerszámlálót. :)
Amúgy PHP-ban ugyanezt korábban már megírtam, az a feladat, hogy egy szövegben több ilyen %akarmi% változó van, és mindet cserélni kell megadott szövegre, mint egy körlevélben.
Ott nagyon jól jött, hogy a preg_replace()-nek meg lehet adni két tömböt, és egy függvényhívással megcsinálja a cserét, így:
http://molnarp.pastebin.com/m110ab065
Perl-ben ilyen nincs, vagy csak én nem találtam meg?
szerk: ja és azt sem értem, hogy a fenti pastebin-es cuccot miért fogta meg a HUP-on a mod_security?
Petya
- A hozzászóláshoz be kell jelentkezni
Valami ilyesmire gondolsz?
use strict;
use warnings;
my $ertek = 'blabla';
my $mertek = 'habla';
my $szoveg = 'Egy %akarmi% nem %barmi%';
my %tagek = ( qr/akarmi/ => $ertek, qr/barmi/ => $mertek);
$szoveg =~ s/% $_ %/$tagek{$_}/gx for (keys %tagek);
print "$szoveg\n";
- A hozzászóláshoz be kell jelentkezni
Igen, ez az, köszönöm!
Petya
- A hozzászóláshoz be kell jelentkezni