从哈希键中的数组中查找值,并返回零计数

时间:2018-10-13 20:18:07

标签: perl

我有一个数组,我正在检查哈希(我创建的)中的值。想法是检查哈希键中是否存在数组的每个元素。如果不存在,则应说不存在的元素出现零次。我创建的用于计算第二个数组上数字频率的哈希值。

这就是我所做的:

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

有任何线索吗?如何修复我的代码?

2 个答案:

答案 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;