我有以下格式的文件
a1 1901 score1
a2 1901 score2
a3 1902 score3
a4 1902 score4
a5 1903 score6
a6 1903 score7
我想创建每年的哈希值和第一列中与今年对应的值作为数组(这意味着年份作为哈希的键,第一列中的值表示值的数组)。 如何使用perl ..
答案 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;