我有一个数组,我正在检查哈希(我创建的)中的值。想法是检查哈希键中是否存在数组的每个元素。如果不存在,则应说不存在的元素出现零次。我创建的用于计算第二个数组上数字频率的哈希值。
这就是我所做的:
use strict;
use warnings;
sub main {
my @Source = ("A", "B", "D");
my @ArrToHash = ("A", "C", "A", "B", "E", "F");
my %hashy;
++$hashy{$_} for @ArrToHash;
foreach my $e (@Source) {
if (exists $hashy{$e}) {
print "$e are $hashy{$e}\n";
}
}
}
main();
我得到了
A是2
B是1
实际上,我想要:
A是2
B是1
D为0
有任何线索吗?如何修复我的代码?
答案 0 :(得分:2)
if (exists $hashy{$e}) {
print "$e are $hashy{$e}\n";
}else{
print "$e are 0\n";
}
OR
printf "%s are %d\n", $e, $hashy{$e} // 0 ;
评论:
我更喜欢$hashy{$e} // 0
。如果$hashy{$e}
退出并且不是undef,它将返回$hashy{$e}
。
池上更喜欢$hashy{$e} || 0
。当0
为空字符串时,它也会返回$hashy{$e}
。它与不支持//
运算符的较早版本的perl一起使用。
恕我直言,在大多数情况下,这是“样式指南”的问题。
答案 1 :(得分:1)
if (exists $hashy{$e}) {
print "$e are $hashy{$e}\n";
} else {
print "$e are 0\n";
}
或者只是
printf "%s are %s\n", $e, $hashy{$e} || 0;
如果您实际上希望散列中为零,
my %hashy;
$hashy{$_} = 0 for @Source;
++$hashy{$_} for @ArrToHash;