2013-07-10 3 views
2

perl 5.10.1에서 each 연산자로 반복하면서 새 멤버를 해시에 추가해도 괜찮습니까?"each"로 해쉬를 반복하면서 새 멤버 추가하기

Smth. 이 코드처럼 내가 배열의 해시의 해시를 가지고, (구글 차트에 대한 데이터를 준비) 나는 각 배열의 마지막 요소로 이동하는 것을 시도하고있다 : 그것은 아니다

sub split_aclr($) { 
     my $csvData = shift; 

     while (my ($csv, $href) = each %$csvData) { 
       next unless $csv =~ /_ACLR_/i; 
       my $len = scalar @{$href->{MEASUREMENT}}; 

       if ($len > 1 && $href->{MEASUREMENT}->[$len - 1] eq 'CARRIER_CHANNEL') { 
         while (my ($key, $arr) = each %$href) { 
           my $moved = pop @$arr; 
           $csvData{$csv . '_CARRIER_CHANNEL'} = {$key => [ $moved ]}; 
         } 
       } 
     } 

}

답변

3

each을 사용하여 반복하는 동안 해시의 항목을 추가하거나 제거하는 것은 일반적으로 안전하지 않습니다. 그렇게하고 싶다면 배열에 반복하려는 키의 명시적인 목록을 저장하고 루프를 반복하는 것이 가장 좋습니다. 대신

while (my $k, $v) = each %hash) { 
    $hash{"foo_$k"} = $v; 
} 

documentation for each()이 꽤 분명하다

my @keys = keys %hash; 
for my $k (@keys) { 
    my $v = $hash{$k}; 
    $hash{"foo_$k"} = $v; 
} 
+0

고마워요! 코드에서'@ keys'를 생략하고'for my $ k (keys % hash) '를 사용하면됩니까? –

+1

@AlexanderFarber 네,이 경우'@ keys '를 생략 할 수 있습니다. 키 목록 복사를 명확하게하기 위해 추가 변수를 사용했습니다. 그러나 반복되는 배열을 수정하려면'foreach' 루프를 사용할 수 없습니다. – amon

2

을 안전한. 그렇게하면 해시 반복기를 재설정하지 않고 삽입 후 해시에 each()를 사용하면 정의되지 않은 동작이 발생합니다. "라는 경고 메시지가 표시됩니다.

0

을한다. 당신이 에 그것을 반복하는 동안 추가 또는 해시의 요소를 삭제하면

, 당신은 항목이 생략 또는 중복 얻을, 그렇게하지 않습니다 수 있습니다.