Ich nehme an, das die globale hashref sein sollte:
my $hash;
Die Schleife geht Trog 1 bis 10 einen lokalen Bereich Hashreferenz $ localref erstellen:
foreach $a (1..10) {
my $localref = {"test"=> 1};
$ localref ist jetzt ein Zeiger auf die Speicheradresse eines hashref enthält {test => 1}
. Versuchen Sie, einen print
Befehl hinzufügen, um es zu sehen:
print $localref;
Sie werden feststellen, dass die Speicheradresse für jeden Schleifendurchlauf ändert gezeigt.
$hash->[$a] = $localref; # does this result in copy?
}
$hash->[$a]
wird mit einem variablen $ hash als ArrayRef genannt. Sie sollten in Erwägung ziehen, es umzubenennen.
Versuchen Sie den Inhalt Ihres „globalen“ $ hash nach der Schleife zeigt:
for (1..10) {
print $_."\t".$hash->[$_];
}
Sie werden sehen, alle Ihre Referenzen noch am Leben.
Use Data :: Dumper um den Inhalt zu zeigen:
use Data::Dumper;
print Dumper($hash);
Schluss Schlussfolgerung:
Der Speicherplatz Speicherung Ihrer HashRefs immer gleich bleibt, wird der Inhalt niemals kopiert werden, aber die Referenz (Adresse Information) wird kopiert. Zwei Referenzen auf den gleichen Ort existieren für einen kurzen Moment zwischen $hash->[$a] = $localref;
und }
.
PS: Der von {"test"=> 1}
verwendete Speicher wird freigegeben, sobald keine Referenz mehr existiert.
Nur als eine Randnotiz .... Sie greifen auf $ Hash als Array, nicht als Hash ($ Hash -> {$ a} = $ localref 'wäre die richtige Sache zu tun) – eballes
Ihr Code enthält keine globalen Hashes oder andere globale Variablen. – mob