在哈希中添加一些键时遇到一些麻烦,即在子例程中修改。这是我的子程序调用:
getMissingItems($filename, \%myItems); #myItems is already defined above this
和子程序本身:
sub getMissingItems {
my $filename = shift;
my $itemHash = shift;
#... some stuff
foreach $item (@someItems) {
if (not exists $itemHash{$item}) {
%$itemHash{$item} = 0;
}
}
}
我收到错误“全局符号%itemHash需要显式包名”
我该如何正确地做到这一点?谢谢。
编辑 - 感谢所有人,在第一个障碍。我现在得到“不能使用字符串(”0“)作为HASH参考,而”严格参考“正在使用中。”我只想将缺失的密钥条目设置为零答案 0 :(得分:3)
您没有使用正确的语法来访问hashref的元素。
在最里面的循环中尝试$itemhash->{$item}
或$$itemhash{$item}
。
答案 1 :(得分:1)
您的sub范围内没有%itemHash
,但您尝试使用名为该变量的变量。
您的意思是访问$itemHash
引用的哈希,所以
if (not exists $itemHash{$item}) {
%$itemHash{$item} = 0;
}
应该是
if (not exists $itemHash->{$item}) {
$itemHash->{$item} = 0;
}
顺便说一句,你可以将其简化为
$itemHash->{$item} //= 0;
(检查元素是否为defined
,而不是exists
,但在这种情况下可能是相同的。)
答案 2 :(得分:1)
要访问哈希引用中的值,请使用箭头取消引用运算符:
if (not exists $itemHash->{$item}) {
$itemHash->{$item} = 0;
}
答案 3 :(得分:1)
第%$itemHash{$item} = 0;
行应为$itemHash->{$item} = 0;
。你试图做的版本不同(和错误)。如需帮助解读参考文献,建议您阅读Perl References Tutorial。
答案 4 :(得分:1)
您的代码有$ itemHash {$ item},它应该是$ itemHash-> {$ item}。下面的代码指向带错误的行。
sub getMissingItems {
my $filename = shift;
my $itemHash = shift;
foreach $item (@someItems) {
if (not exists $itemHash{$item}) { # <--- this is wrong
%$itemHash{$item} = 0; # <--- this one too
}
}
}