1

我有以下哈希

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)
4

2 回答 2

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";
}
于 2013-04-19T23:17:35.150 回答
0

您可以遍历哈希:

my %counterhash = ();

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

之后,counterhash将每个值的哈希值与该值的出现次数

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

文档说:

您需要在 Perl 中声明的唯一内容是报告格式和子例程(有时甚至不需要子例程)。一个变量保存未定义的值(“undef”),直到它被分配一个定义的值,这是“undef”以外的任何值。当用作数字时,“undef”被视为0;当用作字符串时,它被视为空字符串,“”;当用作未分配给的引用时,它被视为错误。

于 2013-04-19T23:13:25.367 回答