Perl%{$var}vs%$var

Perl%{$var}vs%$var,perl,hash,dereference,Perl,Hash,Dereference,%{$var}和%$var之间有什么区别?我尝试了此代码,但出现错误: 在test.pl第21行,每个参考都是实验性的。论元类型 对于每个on引用,必须在test.pl中使用未禁用的hashref或arrayref 第21行 使用功能“说”; %HoH=( 1 => { 丈夫=>“弗雷德”, pal=>“巴尼”, }, 2 => { 丈夫=>“乔治”, 妻子=>“简”, “他的孩子”=>“埃尔罗伊”, }, 3 => { 丈夫=>“荷马”, 妻子=>“玛姬”, 孩子=>“巴特”, }, ); 对

%{$var}
%$var
之间有什么区别?我尝试了此代码,但出现错误:

在test.pl第21行,每个参考都是实验性的。论元类型 对于每个on引用,必须在test.pl中使用未禁用的hashref或arrayref 第21行

使用功能“说”;
%HoH=(
1 => {
丈夫=>“弗雷德”,
pal=>“巴尼”,
},
2 => {
丈夫=>“乔治”,
妻子=>“简”,
“他的孩子”=>“埃尔罗伊”,
},
3 => {
丈夫=>“荷马”,
妻子=>“玛姬”,
孩子=>“巴特”,
},
);
对于($i=1;$i){
丈夫=>“弗雷德”,
pal=>“巴尼”,
},
2 => {
丈夫=>“乔治”,
妻子=>“简”,
“他的孩子”=>“埃尔罗伊”,
},
3 => {
丈夫=>“荷马”,
妻子=>“玛姬”,
孩子=>“巴特”,
},
);

对于($i=1;$i,使用
%$HoH{$i}
可以将哈希引用设置为$HoH,而使用
%{$HoH{$i}}
可以将哈希引用设置为
$HoH{$i}
,这是您想要的…并且,
对代码使用严格的

这是由于解析哈希和订阅哈希的优先级不同。它适用于第二个版本-
%{$HoH{$i}
,因为您明确地声明了通过查找
$HoH{$i}
返回的值本身就是一个hashref


%$HoH{$i}
被解释为
%{$HoH}{$i}
,即在表达式
$HoH
被解释为hashref之后发生下标,而hashref不是
%HoH
是一个散列,但未使用,
$HoH
即未定义。

可能重复的@Emna:OP语言是Perl…对代码使用
使用strict
。@MarcoS:好的,对不起,我通常在代码中使用strict。这只是为了测试的目的谢谢你的回答。:)@反弹,即使在测试中你也必须使用它!在源代码中使用strict时出现的错误完全不同:
全局符号“$HoH”需要显式的包名
,这将为您提供问题的答案。@eballes但仍有一个错误
每个引用都是实验性的
,使用的是严格的。@bounces:
引用键
在perl 1.14之前是专家级的:如果您无法升级,你可以用
no-warnings'experimental'一行关闭警告
就在每个
之前,…@MarcoS我正在使用Perl 5.22。顺便问一下,你是说在perl 5.14之前?
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";
    }
}
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";
    }
}