1

我是 perl 的新手。我想以下列方式存储与键对应的值。请参阅下面的示例输入数据。有人可以帮我在perl中做到这一点。

输出:

key  value
1  (11, 20)
2  (17, 15)
3  (10, 11)

输入数据:

key value
2    17
3    10
1    11 
1   20
2    15
3    11
4

3 回答 3

4

您可以将数据存储在数组哈希结构 ( perldoc perldsc ) 中:

use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my %data;
while (<DATA>) {
    my ($k, $v) = split;
    push @{ $data{$k} } , $v;
}

print Dumper(\%data);

=for output

$VAR1 = {
          '1' => [
                   '11',
                   '20'
                 ],
          '2' => [
                   '17',
                   '15'
                 ],
          '3' => [
                   '10',
                   '11'
                 ]
        };

=cut


__DATA__
2    17
3    10
1    11 
1    20
2    15
3    11
于 2012-07-12T18:13:37.130 回答
1

假设输入数据中的每一行都在一个字符串中,请使用根据定义具有唯一键的散列。

如果散列中存在键,则将值推送到 arrayref。如果它不存在,则为具有该值的键分配一个数组引用。下次出现该键时,您会将值推送到 arrayref。

my $hash = {};

foreach my $line ( @lines ) {
     my ($key, $val) = split(/\s/, $line);

     if( $hash->{$key} ) {
         push( @{ $hash->{ $key } }, $val );
     }
     else {
         $hash->{$key} = [ $val ];
     }
}
于 2012-07-12T18:10:04.833 回答
-1

使用单线:

$ echo "key value
2    17
3    10
1    11 
1   20
2    15
3    11" | perl -anE'next if 1..1;push@{$h{$F[0]}},$F[1]}{say"key  value";$"=", ";say"$_  (@{$h{$_}})"for sort{$a<=>$b}keys%h'
key  value
1  (11, 20)
2  (17, 15)
3  (10, 11)
于 2012-07-12T22:11:14.150 回答