문제의 역사:
while 루프는 Perl의 기본 제어 구조 중 하나로, 데이터 처리, 파일 읽기 및 컬렉션 반복을 위해 처음부터 사용되었습니다. 이는 기본적으로 파일에서 문자열을 읽거나 다른 반복에서 값을 받을 때 특별 변수 $_와 밀접하게 통합되어 있습니다.
문제:
변수 $_의 잘못된 사용, 명시적인 디스크립터 없이 파일을 읽는 것, 루프를 잘못 종료하는 것은 문자열 처리 오류 및 데이터 손실로 이어질 수 있습니다. 기본값으로 $_를 사용한 자동 처리는 유연성을 높이지만, 코드 작성 시 주의가 필요합니다, 특히 중첩 및 루프 내 문자열 수정 시.
해결책:
파일을 읽기 위해 종종 다음 표현식을 사용합니다:
while (<FILEHANDLE>) { # ... }
또는 단순히 while (<>)를 사용하여 입력 스트림이나 스크립트에 전달된 파일 목록에서 읽을 수 있습니다. 이러한 루프 내에서 Perl은 자동으로 읽은 문자열을 $_에 넣어주므로 정규 표현식, 치환 및 기타 작업을 간결하게 사용할 수 있습니다. 변수를 명시적으로 표시해야 할 경우 while (my $line = <FILEHANDLE>) 구조를 사용합니다.
코드 예:
open my $fh, '<', 'file.txt' or die $!; while (<$fh>) { chomp; # $_에 대해 작동합니다 print "문자열: $_ "; } close $fh;
주요 특징:
$_ 변수를 자동으로 사용< 연산자를 통해 파일이나 STDIN에서 문자열 읽기while 루프 내에서 $_를 변경하면 어떻게 되나요?
루프 내에서 $_를 변경하면 읽은 파일에 영향을 미치지 않고 해당 반복의 변수 값만 영향을 받습니다. 그러나 여러 데이터 소스에서 동시에 작업할 경우 $_의 재사용이 혼란을 야기할 수 있습니다.
파일을 미리 열지 않고 while (<>)를 사용하면 어떻게 되나요?
명시적으로 파일을 열지 않는 <> 연산자는 STDIN 또는 스크립트 실행 시 @ARGV에 명시된 파일에서 읽습니다. 아무것도 지정하지 않으면 키보드 입력을 기다립니다.
while 내에서 을 제거하기 위해 chomp를 사용하는 것이 필수인가요?
아니요, 필수는 아니지만 chomp 없이 각 문자열은 개행 문자
을 포함하므로 예기치 않은 결과(예: 출력 시 이중 개행)를 초래할 수 있습니다.
chomp를 사용하지 않음** 부정적 케이스
로그를 파싱하는 스크립트에서 while (<FILE>) 내에 chomp를 추가하는 것을 잊음으로 인해 콘솔 출력 시 불필요한 개행이 생성됨.
장점:
단점:
** 긍정적 케이스
개발자가 항상 변수를 명확히 선언하고 my $line = <$fh>에서 읽은 직후 chomp를 사용.
장점:
단점: