我有一个由两个因素决定的哈希(我不知道这是什么正确的术语),我生成的如下:
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.
它有效,但显然它并不完美。什么是更好的方法?
由于
答案 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
更明智的名字