【问题标题】:count the number of keys that map to a value计算映射到某个值的键的数量
【发布时间】:2013-04-13 10:39:37
【问题描述】:

我有以下哈希

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)

【问题讨论】:

    标签: perl hash counting


    【解决方案1】:

    你可以遍历哈希:

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

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

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

    文档说:

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

    【讨论】:

    • 也可以。你能展示你将如何初始化$key$value 吗?当我做while ( my ($key, $value) = each %hash) {...} 时,它对我不起作用。我收到语法错误。
    • 不太清楚,我是从perlhowto.com/iterate_through_a_hash复制过来的,因为我不是真的用perl编程,所以对语法不熟悉
    • LOL 最后你发布了一个有效的解决方案! +1,我相信你会得到更多积分
    【解决方案2】:

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

    #!/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() 是一个空字符串。 condition ? true : false三元运算符,如果条件为真则返回真部分,否则返回假部分。在这种情况下,它处理语法。
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 2019-01-27
    • 2021-08-28
    • 2020-05-13
    • 2017-10-27
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多