Perl foreach und die änderung der Schleife variable
Schreibe ich ein script in Perl und habe eine Frage zu Perl foreach
konstruieren.
Scheint es, dass, wenn Sie ändern die loop-Variablen ändert sich auf das eigentliche array. Ist dies in der Tat der Fall, oder habe ich etwas getan, vollständig falsch?
Will ich ändern, um eine Zeichenfolge wie abc.abc#a
zu abc_abc_a
(Unterstriche für nicht alpha-numerische Zeichen), aber ich brauche zum beibehalten des ursprünglichen Wertes in den array für die spätere Verwendung.
Ich habe code, der ungefähr so aussieht:
@strings = ('abc.abc#a', 'def.g.h#i');
foreach my $str (@strings){
$str =~ s/[^0-9A-Za-z]/_/g;
print $str, "\n"; #Actually I use the string to manipulate files.
}
Ich konnte das problem lösen, indem Sie Folgendes tun:
@strings = ('abc.abc#a', 'def.g.h#i');
foreach my $str (@strings){
my $temp = $str; #copy to a temporary value
$temp =~ s/[^0-9A-Za-z]/_/g;
print $temp, "\n"; #$str remains untouched...
}
aber es ist ein effizienter Weg, dies zu erreichen?
Vielen Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist nicht verrückt, das ist normal Verhalten. Sehen perldoc perlsyn unter Foreach-Schleifen:
Andere Schleife mit Iteratoren wie anzeigen haben ein ähnliches Verhalten:
Könnte man umschreiben Ihrem code auf diese Weise, das würde zumindest speichern Sie hinzufügen eine extra Zeile:
Können Sie immer eine Kopie des Arrays vor dem ändern von Elementen ('
my
' Hinzugefügt zu beschwichtigenstrict
), viz.:gibt:
@temp
nicht haben Bereich außerhalb derforeach
Schleife.Sind Sie richtig. Als Programming Perl Staaten, die loop-variable ist ein alias für das aktuelle array-element und speichern Sie aus der Schleife variable, wenn alle änderungen werden keine Auswirkungen auf den ursprünglichen Wert.
Den
r
funktioniert nur in Perl5.14
und bis.