Perl에는 해시를 반복하는 여러 방법이 있습니다: each, 키 목록(keys), foreach 및 values를 통해서입니다. 언어의 초기에 해시는 데이터에 빠르게 접근하는 데 사용될 것으로 예상되었기 때문에, 반복 방법은 성능과 추가 메모리 할당 최소화를 염두에 두고 만들어졌습니다.
문제: 이러한 기술을 사용할 때는 많은 함정이 있습니다: 반복 중 해시 변경, 반복기 기억, 요소 순서, each가 해시에 미치는 부작용, 그리고 중첩 반복 시 예기치 않은 동작의 위험 등이 있습니다.
해결책: 안전하고 예측 가능한 반복을 위해서는 foreach my $key (sort keys %hash)를 사용하는 것이 좋고, 반복 중에는 해시를 수정하지 않으며, each를 사용할 경우 새로운 루프 전에 항상 keys %hash로 반복기를 재설정해야 합니다.
코드 예제:
my %hash = ( a => 1, b => 2, c => 3 ); foreach my $key (sort keys %hash) { print "$key: $hash{$key} "; # 예측 가능한 순서 }
주요 특징:
keys를 통한 반복은 키 목록의 복사본을 반환하며, 순서는 정의되지 않습니다.each는 해시에 기억되며, 여러 루프를 동시에 사용할 수 있는 경우는 서로 다른 해시일 때만 가능합니다.each 반복기를 재설정하려면 빈 호출 keys를 사용합니다.each를 통한 반복 중 해시를 안전하게 수정할 수 있나요?
아니요, 이는 예측할 수 없는 결과를 초래할 수 있습니다: 데이터가 누락되거나 여러 번 계산될 수 있습니다.
서로 다른 두 해시에 대해 each를 호출하면 공동 반복기가 생성되나요?
아니요, 반복기는 각 해시에 대해 독립적입니다.
같은 해시에 대해 each를 사용하는 두 개의 루프를 중첩할 수 있나요?
아니요, 반복기가 "틀어져" 결과가 예측할 수 없게 됩니다. 이러한 경우에는 keys와 중첩 루프를 사용해야 합니다.
다른 부분의 동일한 해시를 여러 번 호출하는 함수에서 해시를 반복하기 위해 each를 사용하는 것. 반복기가 틀어져 일부 데이터가 손실됩니다.
장점:
단점:
foreach 및 keys를 사용하여 반복하고, 명시적으로 키를 별도의 배열에 저장하여 전체 반복을 수행합니다.
장점:
단점: