2011-03-30 5 views
1

해시 배열을 만들려고하는데 배열 내의 각 해시를 참조하는 방법이 궁금합니다. 예를 들어Perl 해시 배열 - 배열 내의 각 해시를 참조 하시겠습니까?

: 사전에 어떤 도움

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";  
} 

감사합니다.

+0

이 논리는 해시와 배열의 사용을 다루는 것보다 조금 더 어려움을 겪습니다. 어쩌면 당신은 당신이 달성하고자하는 바를 설명 할 수 있으며 우리는 당신을 올바른 방향으로 향하게 할 수 있습니다. – chambwez

+0

http://perlmonks.org/?node=References+quick+reference 매우 도움이 될 수 있습니다. – ysth

답변

3

당신은

my @total =(); 

이 필요하지 않습니다 :

my @total; 

당신이 후에 무엇에 충분하다. 배열에 해시가 포함될 것임을 선언하는 데 필요한 특수 구문이 필요하지 않습니다.

거기 foreach 부분을하는 아마 다른 방법은,하지만이 작동합니다 :

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

가 [BTW, 그 루프 내부 my @total; 선언은 (는 각 라인에 다시 것) 원하는 아마 아니다. . 첫 번째 루프 밖에서 그 이동]

다음
+0

항상 변수를 초기화해야합니다. 더 이상하지는 않지만 아파치는 데이터 공간을 0으로 재설정하지 않고 mod_perl CGI를 다시 시작합니다. 이것은 이전에 그곳에 있던 모든 값이 재사용된다는 것을 의미했습니다. 방어 적으로 프로그램 : 항상 변수를 초기화하십시오. – shawnhcorey

+0

@ shawnhcorey : 아니요, 프로그램 방어 : 어휘 ("my") 변수를 사용하고 가능한 가장 작은 범위에서 선언하십시오. 전역 변수 (또는 프로그램 전체가 범위 인 어휘)를 사용하지 않으면 변수 범위가 범위를 벗어날 때 변수 값이 손실되기 때문에 데이터 공간이 제로화되어 있는지 여부는 중요하지 않습니다. –

+0

죄송합니다. 어휘 변수는 자신이 속한 블록 또는 블록 외부에있는 경우 해당 파일로 범위가 지정됩니다. 'our'변수와 달리 다른 파일에서 액세스 할 수 없습니다. – shawnhcorey

1

:-) 분명히

그리고 use strict; use warnings; 것은, 내가 무엇을 얻을 : 나는 단순히 @total을하고 슬라이스를 복용 각 hashref을 위해 반복하고있어

print join("\t", @$_{ sort keys %$_ }), "\n" foreach @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와 함께, 당신은 또한 수를 do :

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