perl创建散列,其中值是数组

时间:2018-05-05 01:33:36

标签: perl hash

我有以下格式的文件

a1 1901 score1
a2 1901 score2
a3 1902 score3
a4 1902 score4
a5 1903 score6
a6 1903 score7

我想创建每年的哈希值和第一列中与今年对应的值作为数组(这意味着年份作为哈希的键,第一列中的值表示值的数组)。 如何使用perl ..

2 个答案:

答案 0 :(得分:1)

您应该阅读autovivification

#!perl

use strict;
use warnings;

use Data::Dumper; 

my %h;
while (my $line = <DATA>) {
  chomp $line;
  my ($val, $year) = split /\s+/, $line;

  push @{$h{$year}}, $val;
}

print Dumper \%h;
# $VAR1 = {                   
#          '1901' => [       
#                      'a1', 
#                      'a2'  
#                    ],      
#          '1902' => [       
#                      'a3', 
#                      'a4'  
#                    ],      
#          '1903' => [       
#                      'a5', 
#                      'a6'  
#                    ]       
#        };                  
__DATA__
a1 1901 score1
a2 1901 score2
a3 1902 score3
a4 1902 score4
a5 1903 score6
a6 1903 score7

答案 1 :(得分:0)

所以,下一步是找到与最高分相对应的行,我写了这样的东西。这让我明智地知道什么是最大分数,但我无法获取计算出的最大值的索引,以便我可以使用它来打印第1列中的相应值。 例如:如果1901年得分2是最大值,那么我想打印

a2 1901 score2

但是使用我当前的代码我只能打印

1901 score2

use strict;
use warnings;
use List::Util qw( min max );
use Data::Dumper;
my $file=shift;
open (DATA, $file);
my %h1;
my @tmp;
my $max_value;
my $a;
my $b;
while (my $line = <DATA>) {
  chomp $line;
  my ($val, $year, $score) = split /\s+/, $line;
  push @{$h1{$year}}, $val;
  push @{$h1{$year}}, $score;
}
foreach my $x (sort keys %h1)
{
        foreach (@{$h1{$x}})
        {
                if ($_=~/^[0-9]/)
                {
                        push @tmp, $_;
                }
$max_value= max @tmp;
        }
        print "$x\t$max_value\n";
}
print Dumper \%h1;