Perl에서 파일 작업을 위해서는 open을 사용하여 설명자를 열어야 합니다. 표준 설명자(STDIN, STDOUT, STDERR) 외에도 사용자 정의 설명자를 만들고 관리할 수 있습니다.
Perl은 다양한 파일 유형 및 인코딩을 올바르게 처리하기 위해 입출력 레이어(:encoding, :utf8, :raw 등)의 개념을 사용합니다. 기본적으로 Perl은 텍스트 모드(줄 바꿈 변환 포함) 또는 이진 모드로 작업할 수 있습니다.
open my $fh, '<:encoding(UTF-8)', 'file.txt' or die $!; while (my $line = <$fh>) { print $line; } close $fh;
open my $fh, '<:raw', 'image.bin' or die $!; read($fh, my $data, -s 'image.bin'); close $fh;
올바른 레이어 선택(:raw는 이진 파일, :encoding(NAME)은 텍스트 파일에 적합)이 빈틈 없는 읽기 및 쓰기를 보장합니다.
open FH, '<', $file방법을 사용하여 파일을 열고 이진 데이터를 읽으면 항상 올바른 결과를 얻을 수 있나요?
답변: 아니오! :raw를 명시하지 않으면 Perl은 일부 플랫폼에서 줄 바꿈 문자를 자동으로 변환합니다(예: Windows에서 CRLF → LF). 이진 파일을 읽을 때는 항상 :raw 모드를 사용해야 합니다:
open my $fh, '<:raw', 'file.bin';
이야기
한 기업 프로젝트에서 개발자들은 인코딩을 지정하지 않고 텍스트 로그를 처리했습니다. 그 결과 UTF-8 로그가 가끔 "깨지는" 문제가 발생하였는데, 이는 Perl이 바이트를 잘못 해석하여 파일 읽기가 손상되었기 때문입니다.
open호출에서 명시적으로:encoding(UTF-8)레이어를 추가한 후에만 오류가 수정되었습니다.
이야기
Windows에서 이진 파일을 복사할 때
open FH, '<', 'binfile.dat'를 사용하여 데이터를 읽고 모드를 지정하지 않고 기록했습니다. 프로그램은 줄바꿈 스트림에서 CRLF를 LF로 변경하여 이미지가 손상되는 문제를 발생시켰습니다.:raw레이어가 문제를 해결했습니다.
이야기
외부 API에서 STDOUT의 출력이 반드시 UTF-8이어야 했으나, 프로그래머들은 레이어 변경 없이
binmode STDOUT, ':encoding(UTF-8)'를 명시적으로 적용한 후에 문제가 해결되었습니다.