/ / Perl% {$ var} vs% $ var - Perl, Hash, Dereferenzierung

Perl% {$ var} vs% $ var - Perl, Hash, Dereferenzierung

Was ist der Unterschied zwischen %{$var} und %$var? Ich habe diesen Code ausprobiert, aber es gibt einen Fehler:

Jede Referenz ist experimentell in test.pl Zeile 21. Art des Arguments Zu jedem Verweis muss bei test.pl nicht gesegnete Hashref oder Arrayref sein Zeile 21.

use feature "say";

%HoH = (
1 => {
husband   => "fred",
pal       => "barney",
},
2 => {
husband   => "george",
wife      => "jane",
"his boy" => "elroy",
},
3 => {
husband   => "homer",
wife      => "marge",
kid       => "bart",
},
);

for ($i = 1; $i <= 3; $i++) {
while ( ($family, $roles) = each %$HoH{$i} ) {
say "$family: $roles";
}
}

Aber dieser Code funktioniert gut:

use feature "say";

%HoH = (
1 => {
husband   => "fred",
pal       => "barney",
},
2 => {
husband   => "george",
wife      => "jane",
"his boy" => "elroy",
},
3 => {
husband   => "homer",
wife      => "marge",
kid       => "bart",
},
);

for ($i = 1; $i <= 3; $i++) {
while ( ($family, $roles) = each %{$HoH{$i}} ) {
say "$family: $roles";
}
}

Antworten:

7 für die Antwort № 1

Mit %$HoH{$i} Sie machen eine Hash-Referenz von $ HoH, während Sie mit %{$HoH{$i}} Sie machen eine Hashreferenz von $HoH{$i}, was du willst ... Und, use strict auf deinem Code :-)


2 für die Antwort № 2

Es liegt an den unterschiedlichen Prioritätsstufen der Auflösung des Hashs gegenüber dem Subskribieren des Hashes. Es funktioniert mit der zweiten Version - %{ $HoH{$i} } - weil Sie eindeutig angeben, dass der Wert, der von der Suche von zurückgegeben wird $HoH{$i} ist selbst eine hashref.

Wohingegen %$HoH{$i} wird als interpretiert %{ $HoH }{$i} - dh. Die Subskription erfolgt nach dem Ausdruck $HoH wird als Hashref interpretiert - was nicht "t" ist. %HoH ist ein Hash aber $HoH wird nicht verwendet - d. h. es ist undefiniert.