수색…


파일 읽기 : foreach vs. while

잠재적으로 큰 파일을 읽을 때 while 루프는 foreach 보다 중요한 메모리 이점 foreach 집니다. 다음은 레코드별로 파일 레코드를 읽습니다 (기본적으로 "레코드"는 $/ 로 지정된 "라인"을 의미합니다). 각 레코드는 $_ 할당되어 읽습니다.

while(<$fh>) {
    print;
}

다이아몬드 연산자 는 루프가 "0"문자 만 포함하는 줄 끝과 같은 파일 끝에서만 종료되도록하기 위해 여기에서 마술을 사용합니다.

다음 루프는 똑같이 작동하지만 목록 컨텍스트에서 다이아몬드 연산자를 평가하므로 전체 파일을 한 번에 읽을 수 있습니다.

foreach(<$fh>) {
    print;
}

어쨌든 한 번에 하나의 레코드로 작업하는 경우 엄청난 낭비가 될 수 있으므로 피해야합니다.

긴 목록 처리 중

메모리에 이미 목록이있는 경우 간단하고 일반적으로 처리 할 수있는 방법은 간단한 foreach 루프입니다.

foreach my $item (@items) {
    ...
}

이것은 $item 에 대해 몇 가지 처리를 한 다음 데이터를 유지하지 않고 파일에 쓰는 일반적인 경우에 유용합니다. 그러나 항목에서 다른 데이터 구조를 구축하면 while 루프가 더 효율적입니다.

my @result;
while(@items) {
    my $item = shift @items;
    push @result, process_item($item);
}

$item 대한 참조가 결과 목록에서 직접 끝나지 않는 한 다음 루프 반복을 입력 할 때 @items 배열에서 이동 한 항목을 해제하고 인터프리터가 메모리를 다시 사용할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow