我的数据在一个文件中,基本上像:
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
我的数据在一个文件中,基本上像:
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
如果您只想要特定键的最高值,则将逻辑添加到您对哈希的分配中。此时您将添加一个键和一个值,请执行以下操作:
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} };
因此,任务是两两阅读这些行。使用第一个作为键,第二个作为值,您必须跟踪每个键的最大值。
%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}
已经存在,而不是仅仅消除警告。