计算映射到值的键数

时间:2013-04-19 23:07:02

标签: perl hash counting

我有以下哈希

my %hash = (
    w1 => '0',
    e2 => '1',
    r1 => '2',
    o3 => '1',
    h4 => '0',
    t5 => '1',
);

我想获取映射到散列中每个值的键的数量。

3 keys map to value 1.
1 key map to value 2.
2 keys map to value 0.

我想在不使用模块中的函数的情况下执行此操作。

我想到这样做的一种方法是循环遍历哈希值。如果该值有一个键,则递增该键的计数器。问题是事先知道值是什么,以便我可以为每个值初始化计数器。可能更容易解决这个问题。我认为正则表达式可能有用。

尝试1

my $string;
foreach my $value (value %hash) {
$string = join(",", $value);
}

# count the number of occurrences for each value (separated by commas)

2 个答案:

答案 0 :(得分:3)

使用另一个哈希来计算出现次数。

#!/usr/bin/perl
use warnings;
use strict;

my %hash = (
    w1 => '0',
    e2 => '1',
    r1 => '2',
    o3 => '1',
    h4 => '0',
    t5 => '1',
);

my %count;
for my $value (values %hash) {
    $count{$value}++;
}

for my $value (keys %count) {
    my $count = $count{$value};

    print "$count key", $count == 1 ? q() : 's',
          " map",       $count == 1 ? 's' : q(),
          " to $value.\n";
}

答案 1 :(得分:0)

你可以遍历哈希:

my %counterhash = ();

while ( ($key, $value) = each %hash )
{
  #print "key: $key, value: $hash{$key}\n";
  $counterhash{$value}++;
}

之后,counterhash将是每个值与该值出现次数的散列

您不必初始化每个特定$value的密钥。它最初是未定义的,但在递增时被解释为零。

文档说:

  

您需要在Perl中声明的唯一内容是报告格式和   子程序(有时甚至不是子程序)。变量持有   未定义的值(“undef”),直到为其分配了定义的值,   除了“undef”之外的任何东西。当用作数字时,“undef”   被视为0;当用作字符串时,它被视为空   字符串,“”;当用作未分配的参考时,   它被视为错误。