2013-06-03 5 views
3

다음 코드는 항상 perl에서 작동합니까? 내가 자바로 알고 있기 때문에perl, for 루프에서 배열에서 요소를 제거

for loop iterating over @array { 
    # do something 
    if ($condition) { 
    remove current element from @array 
    } 
} 

이 몇 가지 예외 결과, 위의 코드는 지금 나를 위해 노력하고 있습니다, 그러나 나는 펄의 모든 경우에 작동하는지 확인되고 싶어요. 감사합니다

답변

10

글쎄,이 doc 말했다 것 : LIST의 일부분이 배열 인

경우 스플 라이스와 함께 예를 들어, 루프 본문 내에서 요소를 추가하거나 제거 경우, foreach는 매우 혼란스러워합니다. 그렇게하지 마십시오.

이 조금 더 나은 each와의 :

을 추가하거나 반복하면서 항목이 생략 또는 중복 될 수 있습니다, 해시의 요소를 삭제하면 - 그래서하지 않습니다. 예외 : 에서 현재 구현, 는 대부분의 최근 각()에 의해 반환 된 항목을 삭제하는 것이 안전합니다, 그래서 다음과 같은 코드가 제대로 작동합니다

while (($key, $value) = each %hash) { 
    print $key, "\n"; 
    delete $hash{$key}; # This is safe 
    } 

하지만 여기 최선의 선택을 가정 단지 grep을 사용하는 것입니다 :; $ 내가 <@array에 대한 (내 $ I = 0 :

@some_array = grep { 
    # do something with $_ 
    some_condition($_); 
} @some_array; 
+1

오른쪽의 문서는/제거 루프에 대한 C-스타일에 대한 foreach 루프 요소지만, 무엇을 추가 할 수 없습니다 말한다 ; $ i ++)? – comatose

+1

아, 그건 또 다른 이야기입니다. 'for'가 종료 조건을 검사 할 때마다 기본적으로 배열의 길이를 계산할 때 안전합니다. – raina77ow

+3

빠른 참고 ...'grep' 예제의 마지막 줄은'return'을 제거하기 위해 변경되어야합니다. 인라인 서브 라인의 마지막 라인은 그것이 포함되어야하는지 아닌지를 결정하기위한 조건으로 사용됩니다. ('return'은 문법 오류를줍니다) – jkerian

관련 문제