1

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

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 引用。” 我只想将缺少的密钥条目设置为零

4

5 回答 5

3

您没有使用正确的语法来访问 hashref 的元素。

尝试$itemhash->{$item}$$itemhash{$item}在最里面的循环中。

于 2012-10-05T21:42:54.403 回答
1

您的 sub 范围内没有%itemHash,但您尝试使用名为 that 的变量。

你的意思是访问引用的哈希$itemHash,所以

if (not exists $itemHash{$item}) {
    %$itemHash{$item} = 0; 
}

应该

if (not exists $itemHash->{$item}) {
    $itemHash->{$item} = 0; 
}

顺便说一句,您可以将其简化为

$itemHash->{$item} //= 0; 

(这会检查元素是否为defined,而不是如果它exists,但在这种情况下可能是同一件事。)

于 2012-10-05T21:43:09.700 回答
1

要访问哈希引用中的值,请使用箭头取消引用运算符:

if (not exists $itemHash->{$item}) {
    $itemHash->{$item} = 0;
}
于 2012-10-05T21:43:41.443 回答
1

该行%$itemHash{$item} = 0;应为$itemHash->{$item} = 0;. 您拥有的版本尝试做一些不同的事情(和错误的)。为了帮助解开参考,我建议阅读Perl 参考教程

于 2012-10-05T21:43:53.453 回答
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
        }

    }
}
于 2012-10-05T21:45:27.700 回答