perl:为什么$ hashsize = keys $ hash {$ foo}给出实验警告,我怎样才能更好地编写它?

时间:2015-04-24 10:42:25

标签: perl hash warnings

我有一个由两个因素决定的哈希(我不知道这是什么正确的术语),我生成的如下:

if (exists $cuthash{$chr}{$bin}){
    $cuthash{$chr}{$bin} += 1;
}else{
    $cuthash{$chr}{$bin} = 1;
}

我后来想要获取哈希的每个$ chr部分的大小,这在我这样做时有效:

for my $chr (sort keys %cuthash){
    my $hashsize = keys $cuthash{$chr};
    ...
}

但是我收到了警告:

keys on reference is experimental at ../test.pl line 115.

它有效,但显然它并不完美。什么是更好的方法?

由于

2 个答案:

答案 0 :(得分:8)

如果取消引用hashref

my $hashsize = keys %{ $cuthash{$chr} };

然后应该没有警告。

答案 1 :(得分:3)

如果您使用$cuthash{$chr}{$bin}而不是++,则无需测试是否存在+= 1,因为当操作数为undef时它不会发出警告。只需写下

++$cuthash{$chr}{$bin};

而不是整个if声明。

在这种情况下,显式或使用each提取哈希值的本地副本可能更整洁。这样就不需要块来分隔引用表达式,因此您可以编写%$hashref而不是%{ $cuthash{$chr} }。像这样

for my $chr (sort keys %cuthash) {
    my $val = $cuthash{$chr};
    my $hashsize = keys %$val;
    ...
}

while ( my ($key, $val) = each %cuthash) {
    my $hashsize = keys %$val;
    ...
}

我相信你可以想出一个反映其目的的$val更明智的名字