Perl Array of Hashes - Ссылка на каждый хеш в массиве? - PullRequest
1 голос
/ 30 марта 2011

Я пытаюсь создать массив хэшей, и мне интересно, как ссылаться на каждый хэш в массиве?

Например:

while(<INFILE>)    
{    
  my $row = $_;    
  chomp $row;    
  my @cols = split(/\t/,$row);    
  my $key = $cols[0]."\t".$cols[1];     

  my @total = (); ## This is my array of hashes - wrong syntax???    

  for($i=2;$i<@cols;$i++)    
  {    
    $total[$c++]{$key} += $cols[$i];      
  }    
}

close INFILE;

foreach (sort keys %total)  #sort keys for one of the hashes within the array - wrong syntax???    
{    
  print $_."\t".$total[0]{$_}."\n";    
}

Заранее спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Вам не нужно

my @total = ();

Это:

my @total;

достаточно для того, что вы после. Не требуется специальный синтаксис, чтобы объявить, что ваш массив будет содержать хэши.

Возможно, есть разные способы выполнения части foreach, но это должно сработать:

foreach (sort keys %{$total[$the_index_you_want]}) {
  print $_."\t".$total[$the_index_you_want]{$_}."\n";
}

[Кстати, объявление my @total; внутри этого цикла, вероятно, не то, что вам нужно (оно будет сбрасываться в каждой строке). Переместите это за пределы первого цикла.]

И use strict; use warnings;, очевидно: -)

1 голос
/ 31 марта 2011

Вот что я получаю:

print join( "\t", @$_{ sort keys %$_ } ), "\n" foreach @total;

Я просто перебираю @total, и для каждого хэш-значения берут срез в отсортированном порядке и соединяют эти значения с помощью вкладок.

Если они вам не нужны в отсортированном порядке, вы можете просто

print join( "\t", values %$_ ), "\n" foreach @total;

Но я бы также сжал обработку строки следующим образом:

my ( $k1, $k2, @cols ) = split /\t/, $row;
my $key                = "$k1\t$k2";
$totals[ $_ ]{ $key } += $cols[ $_ ] foreach 0..$#cols;

Но сList::MoreUtils, вы также можете сделать это:

use List::MoreUtils qw<pairwise>;
my ( $k1, $k2, @cols ) = split /\t/, $row;
my $key                = "$k1\t$k2";
pairwise { $a->{ $key } += $b } @totals => @cols;    
...