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

したがって、タスクは行を 2 行ずつ読むことです。最初の値をキーとして、2 番目の値を値として使用すると、各キーの最大値を追跡する必要があります。

%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;

しかし、いつものように、それを行う方法は複数あります。特に一度に 2 行の読み取り。$info{$key}また、警告を黙らせるだけでなく、既に存在するかどうかを明示的にテストすることを好む人もいます。

于 2012-09-28T12:37:20.283 に答える