프로그래밍풀스택 개발자

Perl의 foreach 루프에 대해 설명하십시오: 배열 요소의 복사본과 원본을 다루는 것의 차이점은 무엇이며, 루프 변수를 사용할 때 어떤 함정이 있을 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변

Perl에서 foreach 루프는 배열 요소를 편리하게 순회할 수 있게 해주며, 루프 변수(기본적으로 $_ 또는 명시적으로 지정된)는 배열 요소를 참조하고 값을 복사하지 않습니다.

예:

my @arr = (1, 2, 3); foreach my $x (@arr) { $x *= 2; } # @arr는 (2, 4, 6)입니다 — 요소가 변경되었습니다!

값의 복사본(원본 요소에 대한 참조가 아닌)을 얻으려면 변수를 명시적으로 할당해야 합니다:

foreach my $x ( @arr ) { # $x는 요소의 참조입니다 ... } # ↓↓↓↓ foreach (@arr) { my $copy = $_; ... } # $copy는 복사본이며, $_는 요소에 대한 참조입니다

여러 중첩된 foreach 루프에서 동일한 변수를 사용하는 것은 피해야 하며, 그렇지 않으면 예상치 못한 부작용을 초래할 수 있습니다.


함정이 있는 질문

foreach 루프의 변수가 독립적인 복사본이며 루프 본문에서 안전하게 변경할 수 있습니까?

일반적으로 대답은: "네, 루프가 변수를 스스로 생성하므로 마음대로 변경할 수 있습니다."입니다.

정확한 답변:

Perl에서 기본적으로 루프 변수(예: foreach $var (@arr))는 배열 요소의 **앨리어스(참조)**입니다. 루프 변수를 변경하면 원래 요소가 변경됩니다!

임시 복사본을 변경하려면 루프 내에서 명시적으로 할당해야 합니다:

foreach my $elem (@arr) { my $t = $elem; $t++; # 오직 복사본만, 원래 배열은 변경되지 않음 }

역사


역사 1

레코드를 필터링하는 작업에서 프로그래머가 루프 변수를 수정했으며, 원본 데이터를 변경하고 있다는 것을 몰랐습니다. 이후의 계산은 수정된 배열을 사용하여 진행되었고, 따라서 요소의 합계가 잘못 계산되었습니다. 오류는 참조 샘플과 비교할 때만 나타났습니다.


역사 2

중첩된 foreach는 동일한 변수를 사용했습니다($item). 내부 루프의 변수가 외부 루프의 상태를 덮어버려 첫 번째 통과의 결과가 손실되었고, 배열의 일부가 잘못된 값을 가지게 되었습니다.


역사 3

해시의 참조 배열이 foreach를 통해 반복되었고, 각 루프에서 루프 변수에 새 값이 할당되었습니다. 결과적으로 참조가 "깨져서" 참조 값 대신 스칼라가 들어갔고, 다음 처리 단계가 타입 오류로 실패했습니다.