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