Perl Language
파일의 내용을 변수로 읽어 들이기
수색…
수동 방식
open my $fh, '<', $filename
or die "Could not open $filename for reading: $!";
my $contents = do { local $/; <$fh> };
파일을 연 후 (원시 바이트 대신 특정 파일 인코딩을 읽으려면 man perlio
를 읽음) 트릭은 do
블록에 있습니다. <$fh>
는 다이아몬드 연산자의 파일 핸들이며 파일에서 단일 레코드를 반환합니다 . "입력 레코드 구분 기호"변수 $/
는 "레코드"가 무엇인지 지정합니다. 기본적으로 줄 바꿈 문자로 설정되어 있으므로 "레코드"는 "한 줄"을 의미합니다. $/
는 전역 변수이므로 local
은 두 가지 작업을 수행합니다. $/
의 임시 로컬 복사본을 만들어 블록 끝에서 사라지며 undef
( "value"는 Perl이 제공 한 값)을 제공합니다. 초기화되지 않은 변수로). 입력 레코드 구분 기호에 (비) 값이 있으면 다이아몬드 연산자가 전체 파일을 반환합니다. (전체 파일을 한 줄로 간주합니다.)
do
사용하면 수동으로 파일을 열 수 있습니다. 반복되는 파일 읽기의 경우,
sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }
my $content = readfile($filename);
사용할 수 있습니다. 여기서 다른 전역 변수 ( @ARGV
)는 매개 변수가있는 perl 스크립트를 시작할 때 사용되는 동일한 프로세스를 시뮬레이트하기 위해 지역화되어 있습니다. $/
는 여전히 undef
입니다. 앞에있는 배열이 들어오는 모든 인수를 "먹습니다". 다음으로, 다이아몬드 연산자 <>
는 $/
(전체 파일)에 의해 정의 된 하나의 레코드를 다시 전달하고 do
블록에서 돌아온다.
하위에는 명백한 오류 처리가 없으므로 나쁜 관행입니다! 파일을 읽는 중에 오류가 발생하면 빈 파일의 빈 문자열과 달리 반환 값으로 undef
가 수신됩니다.
마지막 코드의 또 다른 단점은 PerlIO를 다른 파일 인코딩에 사용할 수 없다는 것입니다. 항상 원시 바이트를 얻습니다.
경로 :: Tiny
The Manual Way 의 숙어를 스크립트에서 여러 번 사용하면 곧 지루해져 모듈을 시험해 볼 수 있습니다.
use Path::Tiny;
my $contents = path($filename)->slurp;
파일 인코딩, 라인 엔딩 등을 제어해야한다면 binmode
옵션을 넘길 수 있습니다 - see man perlio
:
my $contents = path($filename)->slurp( {binmode => ":encoding(UTF-8)"} );
Path::Tiny
는 또한 파일을 다루기위한 많은 다른 기능 을 가지고 있으므로 좋은 선택이 될 수 있습니다.
파일 :: Slurper
이 파일은 파일을 변수로만 변환하는 미니멀리스트 모듈입니다.
use File::Slurper 'read_text';
my $contents = read_text($filename);
read_text()
는 두 가지 선택적 매개 변수를 사용하여 파일 인코딩을 지정하고 줄 끝을 unixish LF 또는 DOSish CRLF 표준간에 변환해야하는지 여부를 지정합니다.
my $contents = read_text($filename, 'UTF-8', 1);
파일 :: Slurp
사용하지 마십시오. 오랫동안 사용되어 왔지만 여전히 대부분의 프로그래머가 제안 할 모듈 이지만 깨져서 수정 될 가능성은 거의 없습니다 .
파일을 배열 변수로 슬래 밍하기
open(my $fh, '<', "/some/path") or die $!;
my @ary = <$fh>;
목록 컨텍스트에서 평가할 때 다이아몬드 연산자는 파일의 모든 행으로 구성된 목록을 반환합니다 (이 경우 배열에 결과를 할당하면 목록 컨텍스트가 지정됩니다). 라인 터미네이터는 유지되며, 다음과 같이 제거 할 수 있습니다.
chomp(@ary); #removes line terminators from all the array elements.
한 줄짜리 슬럿 파일
입력 레코드 분리 기호는 -0
스위치 ( 0 은 아니고 대문자 O )로 지정할 수 있습니다. 값으로 8 진수 또는 16 진수를 취합니다. 0400
이상의 값을 지정하면 Perl이 파일을 slurp하지만, 관습에 0777
목적에 사용되는 값은 0777
입니다.
perl -0777 -e 'my $file = <>; print length($file)' input.txt
미니멀리즘과 함께 -n
스위치를 지정하면 Perl이 자동으로 각 라인 (이 경우 전체 파일)을 변수 $_
로 읽습니다.
perl -0777 -ne 'print length($_)' input.txt