수색…


매개 변수

방법 설명
> 쓰기 (trunc) . 기존 파일을 덮어 씁니다. 파일이 없으면 새 파일을 만듭니다.
>> 쓰기 (추가) . 파일을 덮어 쓰지 않고 마지막에 새로운 내용을 추가합니다. 존재하지 않는 파일을 여는 데 사용되는 경우 파일을 작성합니다.
< 읽기 . 읽기 전용 모드로 파일을 엽니 다.
+< 읽기 / 쓰기 . 파일을 만들거나 자르지 않습니다.
+> 읽기 / 쓰기 (trunc) . 파일을 만들고 자릅니다.
+>> 읽기 / 쓰기 (추가) . 파일을 만들지 만 자르지 않습니다.

비고

chomp 는 파일에서 읽을 때 자주 사용됩니다. 기본적으로 줄 바꿈 문자는 전체 기능이 perldocs를 참조하기는하지만 트리밍됩니다.

문자와 바이트의 차이에주의하십시오. 모든 인코딩 (특히 UTF-8)이 1 바이트 문자를 사용하는 것은 아닙니다. 이것이 PerlIO에 의해 완벽하게 처리되는 동안, 주목할만한 하나의 함정이 있습니다 :

  • read길이오프셋 매개 변수에 문자 를 사용 합니다.
  • seektell 항상 위치에 대한 바이트를 사용

따라서 이러한 혼합 된 값을 기반으로 한 산술을 사용하지 마십시오. 대신 Encode::encode('utf8',$value_by_read) 를 사용하여 read 결과에서 8 진수 (바이트)를 가져 Encode::encode('utf8',$value_by_read) 그 수를 tellseek 과 함께 사용할 수 있습니다.

파일에서 읽기

my $filename = '/path/to/file';

open my $fh, '<', $filename or die "Failed to open file: $filename"; 
    
# You can then either read the file one line at a time...
while(chomp(my $line = <$fh>)) {
    print $line . "\n";
}

# ...or read whole file into an array in one go
chomp(my @fileArray = <$fh>); 

입력 파일이 UTF-8 인 경우 인코딩을 지정할 수 있습니다.

open my $fh, '<:encoding(utf8)', $filename or die "Failed to open file: $filename";

파일에서 읽은 후에는 파일 핸들을 닫아야합니다.

close $fh or warn "close failed: $!";

참고 항목 : 변수로 파일 읽기

파일을 읽는 또 다른 빠른 방법은 File :: Slurper Module을 사용하는 것입니다. 이것은 많은 파일로 작업 할 때 유용합니다.

use File::Slurper;
my $file = read_text("path/to/file"); # utf8 without CRLF transforms by default
print $file; #Contains the file body

또한보십시오 : [slurp로 파일 읽기]

파일에 쓰기

이 코드는 쓰기를 위해 파일을 엽니 다. 파일을 열 수없는 경우 오류를 반환합니다. 또한 마지막에 파일을 닫습니다.

#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

# Open "output.txt" for writing (">") and from now on, refer to it as the variable $fh.
open(my $fh, ">", "output.txt")
# In case the action failed, print error message and quit.
or die "Can't open > output.txt: $!";

이제 우리는 $fh (이 변수는 파일 핸들 (filehandle )이라고 부름)를 통해 접근 할 수있는 열린 파일을 쓰기 위해 준비했습니다. 다음으로 print 연산자를 사용하여 출력을 해당 파일로 보낼 수 있습니다.

# Print "Hello" to $fh ("output.txt").
print $fh "Hello";
# Don't forget to close the file once we're done!
close $fh or warn "Close failed: $!";

open 연산자는 첫 번째 매개 변수로 스칼라 변수 (이 경우 $fh 를 갖습니다. open 연산자에서 정의 되었으므로 파일 핸들 로 처리됩니다. 두 번째 매개 변수 ">" (보다 큼)는 파일이 쓰기 위해 열렸 음을 정의합니다. 마지막 매개 변수는 데이터를 쓸 파일의 경로입니다.

파일에 데이터를 쓰려면 파일 핸들 과 함께 print 연산자가 사용됩니다. print 연산자에서 파일 핸들 과 명령문 자체 사이에 쉼표가 없으며 공백 만 있습니다.

읽기를위한 FileHandle 열기

일반 ASCII 텍스트 파일 열기

5.6.0
open my $filehandle, '<', $name_of_file or die "Can't open $name_of_file, $!";

이것은 "default"File IO의 기본 관용구이며, $filehandle 은 기본 시스템 특정 디코더로 필터링 된 bytes 의 읽을 수있는 입력 스트림을 만듭니다.이 시스템은 open pragma를 사용하여 로컬로 설정할 수 있습니다

Perl 자체는 파일 열기시 오류를 처리하지 않으므로 open 의 종료 조건을 검사하여 직접 처리해야합니다. $! 열려있는 오류 메시지로 채워집니다.

Windows에서 기본 디코더는 "\ r \ n"시퀀스를 입력의 "\ n"에 매핑하는 "CRLF"필터입니다.

바이너리 파일 열기

5.8.0
open my $filehandle, '<:raw', 'path/to/file' or die "Can't open $name_of_file, $!";

이것은 Perl이 Windows에서 CRLF 변환을 수행 하지 않아야 함을 지정합니다.

UTF8 텍스트 파일 열기

5.8.0
open my $filehandle, '<:raw:encoding(utf-8)', 'path/to/file' 
   or die "Can't open $name_of_file, $!";

이것은 Perl이 CRLF 변환을 피한 다음 결과 바이트를 바이트 문자열 대신 문자 스트링 (내부적으로 255보다 큰 정수 배열로 구현 됨)으로 디코딩하도록 지정 합니다

파일 읽기 및 쓰기

텍스트 파일을 읽고 쓰기 전에 어떤 인코딩을 사용해야하는지 알아야합니다. 인코딩에 대한 자세한 내용은 Perl 유니 코드 문서를 참조하십시오 . 여기서 우리는 UTF-8 함수의 기본 인코딩 및 디코딩 등의 설정 표시 open . 이 작업은 코드 상단 근처에서 open pragma를 사용하여 수행됩니다 ( use strict;use strict; 바로 use warnings; 것이 적절할 수 있습니다).

use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); 

open 함수는 파일 읽기 및 / 또는 파일 쓰기에 사용되는 파일 핸들을 만듭니다. open 함수에는 서명이 있습니다.

open(FILEHANDLE, MODE, FILEPATH) . 조작이 실패하면 false 값을 리턴합니다. 오류 설명은 $! .

독서

#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

my $file_path = "/path/to/file";
open(my $file_handle, '<', $file_path) or die "Could not open file! $!";

while(my $row = <$file_handle>) {
    print chomp($row), "\n";
}

close $file_handle 
      or warn "Close failed!";

쓰기

#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

my $file_path = "/path/to/file";
open(my $file_handle, '>', $file_path) or die "Could not open file! $!";

print $file_handle "Writing to a file";

close $file_handle 
      or warn "Close failed!";

청크 읽기

큰 파일을 열고 읽는 것은 시간과 자원을 필요로합니다. 내용의 작은 부분 만 필요한 경우 서명이있는 read 기능을 사용하여 청크로 내용을 읽는 것이 좋습니다

read(FILEHANDLE, SCALAR, LENGTH, OFFSET)

FILEHANDLE 은 열려있는 파일 핸들이어야하며, SCALAR 은 작업 후에 읽은 데이터를 보유합니다. LENGTHOFFSET 에서 시작하여 읽을 문자 수를 지정합니다. 이 함수는 읽은 문자 수를 반환하고, 파일 끝에 도달하면 0 반환하고 오류가 발생하면 undef 를 반환합니다.

read($file_handle, $data, 16, 0); 

파일의 시작 부분에서 $data 로 16자를 읽습니다.

"autodie 사용"및 파일 열기 / 닫기 실패를 확인할 필요가 없습니다.

autodie 사용하면 명시 적으로 열림 / 닫힘 오류를 확인하지 않고도 파일 작업을 할 수 있습니다.

Perl 5.10.1 이후, autodie pragma는 펄 Perl에서 사용 가능합니다. 사용시 Perl은 파일을 열거 나 닫을 때 자동으로 오류를 확인합니다.

다음은 한 파일의 모든 행을 읽고 로그 파일의 끝에 기록하는 예입니다.

use 5.010;    # 5.010 and later enable "say", which prints arguments, then a newline
use strict;   # require declaring variables (avoid silent errors due to typos)
use warnings; # enable helpful syntax-related warnings
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
use autodie;  # Automatically handle errors in opening and closing files

open(my $fh_in, '<', "input.txt"); # check for failure is automatic

# open a file for appending (i.e. using ">>")
open( my $fh_log, '>>', "output.log"); # check for failure is automatic

while (my $line = readline $fh_in) # also works: while (my $line = <$fh_in>)
{
     # remove newline
     chomp $line;

     # write to log file
     say $fh_log $line or die "failed to print '$line'"; # autodie doesn't check print
}

# Close the file handles (check for failure is automatic)
close $fh_in;
close $fh_log;

그건 그렇고, 기술적으로 항상 print 문을 확인해야합니다. 많은 사람들은 그렇지 않지만 perl (Perl 통역사)은 자동으로 이것을 하지 않으며 autodie 않습니다 .

파일 핸들 되감기

때로는 읽은 후 되돌아 갈 필요가 있습니다.

# identify current position in file, in case the first line isn't a comment
my $current_pos = tell; 

while (my $line = readline $fh)
{
    if ($line =~ /$START_OF_COMMENT_LINE/)
    {
        push @names, get_name_from_comment($line);
    }
    else {
        last; # break out of the while loop
    }
    $current_pos = tell; # keep track of current position, in case we need to rewind the next line read
}

# Step back a line so that it can be processed later as the first data line
seek $fh, $current_pos, 0;

gzip 압축 파일 읽기 및 쓰기

gzipped 파일 작성

gzip으로 압축 된 파일을 작성하려면 IO::Compress::Gzip 모듈을 use 하고 원하는 출력 파일에 IO::Compress::Gzip 의 새 인스턴스를 만들어 파일 핸들을 만듭니다.

use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

use IO::Compress::Gzip;

my $fh_out = IO::Compress::Gzip->new("hello.txt.gz");

print $fh_out "Hello World!\n";

close $fh_out;

use IO::Compress::Gzip;

gzipped 파일에서 읽기

gzip으로 압축 된 파일을 읽으려면 IO::Uncompress::Gunzip 모듈을 use 하고 입력 파일에 IO::Uncompress::Gunzip 의 새 인스턴스를 만들어 파일 핸들을 만듭니다.

#!/bin/env perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

use IO::Uncompress::Gunzip;

my $fh_in = IO::Uncompress::Gunzip->new("hello.txt.gz");

my $line = readline $fh_in;

print $line;

IO에 대한 기본 인코딩 설정

# encode/decode UTF-8 for files and standard input/output
use open qw( :encoding(UTF-8) :std ); 

pragma 는 텍스트 (파일, 표준 입력, 표준 출력 및 표준 오류)를 읽고 쓰는 기본 모드를 UTF-8로 변경합니다.이 모드는 일반적으로 새 응용 프로그램을 작성할 때 원하는 것입니다.

ASCII는 UTF-8의 하위 집합이므로 기존 ASCII 파일에 문제가 발생할 것으로 예상되지 않으며 UTF-8 파일을 ASCII로 처리 할 때 우발적 인 파일 손상을 방지하는 데 도움이됩니다.

그러나 파일의 인코딩이 처리중인 내용을 알고 그에 따라 처리하는 것이 중요합니다. ( 우리가 유니 코드를 무시해서는 안되는 이유. ) 유니 코드에 대한 심도있는 처리에 대해서는 Perl 유니 코드 항목을 참조하십시오.



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