2012-10-05 29 views
1

在将某些键添加到哈希中(即修改子例程)时遇到一些麻烦。这里是我的子程序调用:在子例程中修改哈希的Perl - 全局符号需要明确的包名称

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 ref,而使用”strict refs“。”我只想将丢失的键条目设置为零

+0

新的错误只会发生在您提供的代码中,如果您在“...”的某个地方将$ itemhash迂回。请提供一个最小的,可运行的问题演示。如果你开始一个新的问题没关系,因为它与你已经问过的问题无关。 – ikegami

+0

其实我在发布内部循环之前没有使用$ itemHash。而且,曲线? – JDS

+0

我能够使用“undef”,它似乎在做这项工作,因为其他地方的脚本undef被转换为0.但我会好奇为什么这不起作用,我认为我可以尊重和修改散列(添加键等)。 – JDS

回答

1

您的子范围中没有%itemHash,但您尝试使用名为该变量的变量。

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

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

应该

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

顺便说一句,你可以简化到

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

(检查是否元素是defined,而不是是否exists,但是这可能在这种情况下,同样的事情)

3

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

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

1

要在哈希引用存取权限的值,请使用箭头引用操作:

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

线%$itemHash{$item} = 0;应该阅读$itemHash->{$item} = 0;。你有版本试图做一些不同的(和错误的)。为了帮助解开参考文献,我建议您阅读Perl References Tutorial

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 
     } 

    } 
} 
相关问题