2009-09-04 6 views
0

해시에 대한 수학 연산을 수행하기 위해 Perl 스크립트를 작성했습니다. 이 해시에는 아래 샘플에 지정된 값이 들어 있습니다. 아래 코드를 작성했습니다. foreach 루프를 사용하지 않고이 코드를 배열 값에 대해 별도로 실행하면 출력이 정상입니다. 그러나 배열 값에 foreach 루프를 사용하여이 작업을 실행하면 A의 값에 대한 합계는 좋지만 B에서 출력에 이전 값이 추가됩니다.foreach 루프에서 배열을 새로 고치는 방법은 무엇입니까?

Hash Sample: 

$VAR1 = 'A'; 
$VAR2 = { 
    '"x"' => [values], 
    '"y"' => [values], 
    and so on... 
$VAR3 = 'B'; 
$VAR4 = { 
     '"x"' => [values], 
    '"y"' => [values], 
    and so on... 
$VARn.... 

코드 :

#!/usr/bin/perl -w 
use strict; 
use List::Util qw(sum); 

my @data; 
my @count; 
my $total; 

my @array = ("A", "B", "C", "D"); 

foreach my $v (@array) { 

     my %table = getV($v); #getV is a subroutine returing a hash. 
     for my $h (sort keys %table) { 
        for my $et (sort keys %{ $table{$h} }) { 
     for $ec ($table{$h}{$et}) { 
          push @data, $ec; 
          @count = map { sum(@{$_}) } @data; 
          $total = sum(@count); 
         } 
      } 
print "sum of $v is $total\n"; 
} 

나는 문제가이 라인으로 생각합니다. 모든 이전 값을 저장하므로 다음 foreach 루프에 모든 값을 추가합니다.

push @data, $ec; 

그래서, 나는 여기 두 가지 문제가 있습니다

1) 나는 각 foreach 루프 반복에서 배열 (@data)를 새로 고칠 수 있습니까?

2) 어떻게 배열 ref ($ ec)에 값을 추가하고 배열에 저장할 수 있습니까? 왜냐하면 다음 코드를 사용할 때 :

for $ec ($table{$h}{$et}) { 
    @count = map { sum(@{$_}) } @$ec; 
    $total = sum(@count); 
} 

결과는 @count와 $ total에 대해 동일한 값을 제공합니다.

의견을 보내주십시오.

답변

4

정확하게 이해하면 코드가 약간 변경됩니다. 루프 시작 부분에 빈 배열 (@data)을 만듭니다. 희망이 도움이됩니다.

 for my $h (sort keys %table) { 
        my @data; 
+2

사실 루프 안에서 'my @data;'라고 말하면됩니다. 매번 새로운 '@ data'가됩니다. – friedo

+2

'my @data =();의'=()'은 의미가 없습니다. 'my'를 사용하여 배열을 만들면 비어 있습니다. 빈 목록을 지정하면 당신과 펄의 시간은 달라지지 않습니다. –

0

1) @ 빈 배열을 새 루프 배열로 시작하려는 루프 본문의 맨 위에서 선언하십시오. 또는 @data = @$ec이 아니라 push @data, $ec이 아닐 수도 있습니다.

2) $ ec가 참조하는 배열에 값을 추가하려면 sum(@$ec); 지도가 필요하지 않습니다.

데이터 구조가 무엇인지 또는 무엇을하려고하는지 명확하게 알 수는 없습니다. 예제 % 테이블의 모양과 예상 결과를 확인하는 데 도움이됩니다.

관련 문제