수색…


수동 방식

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


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