Perl修改子例程中的哈希 - 全局符号需要显式包名

时间:2012-10-05 21:40:21

标签: perl hash reference

在哈希中添加一些键时遇到一些麻烦,即在子例程中修改。这是我的子程序调用:

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参考,而”严格参考“正在使用中。”我只想将缺失的密钥条目设置为零

5 个答案:

答案 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
        }

    }
}