【问题标题】:Perl - Count occurances of array elements in text file?Perl - 计算文本文件中数组元素的出现次数?
【发布时间】:2016-05-20 23:41:27
【问题描述】:

所以我有一个单词数组(foo,bar,baz,hello),我想计算另一个数组(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 的内容是从文本文件中提取的。

【问题讨论】:

  • 上面代码中的小错误:$hash{$count]++ 应该是 $hash{$count}++ 注意右大括号

标签: arrays perl


【解决方案1】:

遍历 array1 而不是哈希键:

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

【讨论】:

    【解决方案2】:

    你需要做的就是改变你声明%hash的方式

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

    这将创建一个散列,其中包含来自 @array1 的键全部初始化为零。

    【讨论】:

      【解决方案3】:

      你也可以不手动循环计数,使用 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
      

      【讨论】:

      • 这涉及到不必要地循环遍历@array2 的所有元素多次(在grep 内)。 $i 也是一个不好的标识符选择,因为它通常用于数组索引。它包含来自@array1 的“单词”,那么$word 怎么样?
      • 那么哪种方式最好?
      • @Borodin 无论如何,如果您不想创建从未出现在 array1 中的键的散列,那么您将不得不为 array1 的每个元素循环它。至于变量,它是一个单行循环,它是一个一次性的单字符变量。
      • @123: “如果你不想创建一个从未出现在 array1 中的键的哈希” 那你为什么不这样做呢?
      • @user145265:“最佳” 方法是您可以在一周的时间内阅读并最好地理解它在做什么的方法。这是最能向您暗示它正在做什么的解决方案。这就是语言单词ifwhile、for` 等不是op1op2op3 的原因;该语言提供了一个框架,允许您编写自我表示的代码。你很容易误用它,但我建议你应该使用标识符和语言结构,让你的代码被解读为接近自然语言的东西。甚至汇编程序也有类似 MVB 的东西用于 move byte
      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多