/ / Perl% {$ var} vs% $ var - perl, hash, desreferencia

Perl% {$ var} vs% $ var - perl, hash, desreferencia

Cuál es la diferencia entre %{$var} y %$var? He intentado este código pero hay un error:

cada referencia es experimental en la línea 21 de test.pl. Tipo de argumento a cada referencia on debe ser hashref o arrayref no probado en test.pl línea 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";
}
}

Pero este código funciona bien:

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";
}
}

Respuestas

7 para la respuesta № 1

Con %$HoH{$i} usted hace una referencia de hash de $ HoH, mientras que con %{$HoH{$i}} haces una referencia de hash de $HoH{$i}, que es lo que quieres ... y, use strict en su código :-)


2 para la respuesta № 2

Esto se debe a los diferentes niveles de precedencia para resolver el hash frente a la subscripción del hash. Funciona con la segunda versión - %{ $HoH{$i} } - porque está indicando sin ambigüedad que el valor devuelto por la búsqueda de $HoH{$i} Es en sí mismo, un hashref.

Mientras %$HoH{$i} se interpreta como %{ $HoH }{$i} - es decir La subscripción está ocurriendo después de la expresión. $HoH se interpreta como un hashref, que no es "t". %HoH es un hash pero $HoH no se usa, es decir, está indefinido.