foreach my $var (@Liste) — $var eine Referenz?
So, ich wusste nie, dies und das möchte ich um einige clarifcation auf Sie. Ich weiß, wenn Sie
foreach (@list){
wenn Sie ändern $_ in dieser Schleife wird auf die tatsächlichen Daten. Aber, ich wusste nicht, dass, wenn Sie Tat
foreach my $var1 (@list){
Wenn Sie änderungen an $var1 in der Schleife, die Sie ändern würden, die die tatsächlichen Daten. :-/Also, gibt es eine Möglichkeit, eine Schleife über @Liste, aber halten Sie der variable einen nur-lese-Kopie, oder eine Kopie, wenn geändert wird, nicht ändern Sie den Wert im @list?
Du musst angemeldet sein, um einen Kommentar abzugeben.
$var
ist als alias für jedes Element in der Reihe.Sehen http://perldoc.perl.org/perlsyn.html#Foreach-Loops
Einfachste Weg ist, einfach zu kopieren:
oder
Aber wenn $var1 ist eine Referenz, $var1_scratch wird eine Referenz auf die gleiche Sache.
Wirklich sicher sein, müsste man so etwas wie Lagerfähig::dclone zu tun, eine Tiefe Kopie:
(ungetestet). Dann sollten Sie in der Lage sein, um sicher ändern $var1. Aber es könnte teuer werden, wenn
@- Liste ist eine große datastructure.
Es ist ein alias, nicht eine Referenz. Wenn Sie möchten, erstellen Sie Ihre eigene Aliase (außerhalb von Z), die Sie verwenden können,Daten::Alias.
Der einzige Unterschied zwischen diesen Schleifen:
ist die loop-variable. Das aliasing ist eine Funktion von
foreach
, nicht die implizite variable$_
. Beachten Sie, dass dies eine alias (ein anderer name für die gleiche Sache) und nicht eine Referenz (ein Zeiger auf eine Sache).In der einfachen (und häufigsten) Fall, können Sie brechen die aliasing, indem Sie eine Kopie:
Dies funktioniert für normale Skalare Werte. Für Verweise (oder Objekte), die Sie brauchen würde, um eine Tiefe Kopie mit Lagerfähig oder Klon, das könnte teuer werden. Gebundene Variablen sind ebenso problematisch, perlsyn empfiehlt die Vermeidung der situation völlig.
Ich weiß nicht, wie zu zwingen, die Variablen werden by value anstatt by reference in die foreach-Anweisung selbst. Sie können kopieren Sie den Wert des
$_
obwohl.my $v = shift;
du meinstmy $v = $_;
.my $v = $_;
🙁Machen Sie eine Kopie @Liste in der for-Anweisung: