Perl - 计算文本文件中数组元素的出现次数?

时间:2016-02-10 14:46:15

标签: arrays perl

所以我有一个单词数组(foo,bar,baz,你好),我想计算另一个数组(foo,foo,bar,bar,bar,baz,baz)的出现,然后创建一个哈希作为键的单词和作为值的出现次数,如果在另一个数组中找不到该单词,则输出应为0,我的代码:

my @array1 = ("foo","bar", "baz", "hey");
my @array2 = ("foo", "foo", "bar", "bar", "bar", "baz", "baz");
my %hash;

foreach my $count (@array2){
$hash{$count}++;
}
for my $key (sort keys %hash) {
print "$key = $hash{$key}\n";
}

这个输出将是

foo = 2
bar = 3
baz = 2

如何使用@ array1计算@ array2中元素的出现次数,以便它提供输出:

foo = 2
bar = 3
baz = 2
hey = 0

这样我可以在@ array1中添加新元素以供将来进行比较操作吗?因为我的当前解决方案没有扩展,因为@ array2的内容是从文本文件中提取的。

3 个答案:

答案 0 :(得分:0)

遍历array1而不是散列键:

for my $key (@array1) {
  my $count = $hash{$key} // 0;
  print "$key = $count\n";
}

答案 1 :(得分:0)

您需要做的就是更改声明%hash

的方式
my %hash = map {$_ => 0} @array1;

这将创建一个哈希,其中@array1的键全部初始化为零。

答案 2 :(得分:0)

您也不能手动计算循环次数,使用grep为您计算。

use strict;
use warnings;

my @array1 = ("foo","bar", "baz", "hey");
my @array2 = ("foo", "foo", "bar", "bar", "bar", "baz", "baz");
my %hash;

for my $i (@array1){
$hash{$i}=grep{/^${i}$/} @array2
}

print "Key: $_ and Value: $hash{$_}\n" for (keys%hash);

产生

Key: bar and Value: 3
Key: baz and Value: 2
Key: hey and Value: 0
Key: foo and Value: 2