我有以下哈希
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)
答案 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;当用作字符串时,它被视为空 字符串,“”;当用作未分配的参考时, 它被视为错误。