1

我的数据在一个文件中,基本上像:

a
2
b
6
a
4
f
2
b
1
a
7

我有这个哈希:

%hash = {
    a => 2,
    b => 6,
    a => 4,
    f => 2,
    b => 1, 
    a => 7,
};

我怎样才能找到重复的键以及它们之间的关系?我想要最有价值的那个。

期望的输出:

a-->7 
b-->6
f-->2
4

2 回答 2

3

如果您只想要特定键的最高值,则将逻辑添加到您对哈希的分配中。此时您将添加一个键和一个值,请执行以下操作:

unless (exists $hash{$key} and $hash{$key} >= $value)
{
   $hash{$key} = $value;
}

如果您需要保留所有值,则使每个关键点指向一个值数组。这是您的作业的样子:

#Add an element to the array of values for this key.
push @{ $hash{$key} }, $value;

这是在结果数组中为给定键找到最大值的好方法:

use List::Util qw/max/;

print max @{ $hash{$key} };
于 2012-09-28T12:27:39.920 回答
0

因此,任务是两两阅读这些行。使用第一个作为键,第二个作为值,您必须跟踪每个键的最大值。

%info;

# A loop reading two lines.
while( my $key = <> ) {
    my $value = <>;

    # Handle the case where there are an odd number of lines.
    die "Odd number of lines" unless (defined $value);

    # Assuming only non-negative values, we just silently want to compare
    # keys not seen before as having value 0. See 'perllexwarn' manual page
    no warnings 'uninitialized'; 

    $info{$key} = $value if $info{$key} <= $value;
}

# Dump the result
say "$_ --> $info{$_} for keys %info;

但像往常一样,有不止一种方法可以做到这一点。尤其是一次读两行。此外,有些人可能更喜欢明确测试是否$info{$key}已经存在,而不是仅仅消除警告。

于 2012-09-28T12:37:20.283 回答