Perl 计算映射到某个值的键数

Perl 计算映射到某个值的键数,perl,hash,counting,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. 我希望在不使用模块函数的情况下执行此操作 我想到的一种方法是循

我有下面的散列

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)

您可以通过哈希循环:

my %counterhash = ();

while ( ($key, $value) = each %hash )
{
  #print "key: $key, value: $hash{$key}\n";
  $counterhash{$value}++;
}
之后,
counterhash
将每个值的哈希值与该值的出现次数相加

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

文件说:

在Perl中只需要声明报表格式和 子程序(有时甚至不是子程序)。变量保存 未定义值(“未定义”),直到为其分配了定义值, 它不是“undef”。当用作数字时,“未定义” 被视为0;当用作字符串时,它被视为空字符串 字符串“”;当用作未分配给的引用时, 它被视为一个错误


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

#!/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";
}

你能解释一下print语句中的语法吗?例如,什么是
q()
's'
?什么是
q()
是一个空字符串<代码>条件?true:false是三元运算符,如果条件为true,则返回true部分,否则返回false部分。它处理本例中的语法。这也行。您能否演示如何初始化
$key
$value
?当我做
while(my($key,$value)=each%hash){…}
时,它对我不起作用。我得到了语法错误。不确定,我从中复制了它,因为我不是真正用perl编程,所以我不熟悉syntaxLOL。最后你发布了一个有效的解决方案+1,我相信你会得到更多的分数