Perl에서 파일을 열고 읽는 가장 좋은 방법은 무엇입니까?


Answers

전체 파일을 단일 문자열로 사용하려면 반복 할 필요가 없습니다.

use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );
my $data = q{};
{
   local $RS = undef; # This makes it just read the whole thing,
   my $fh;
   croak "Can't open $input_file: $!\n" if not open $fh, '<', $input_file;
   $data = <$fh>;
   croak 'Some Error During Close :/ ' if not close $fh;
}

위는 perlcritic --brutal 만족 perlcritic --brutal '우수 사례'를 테스트하는 좋은 방법입니다 :). $input_file 은 아직 정의되지 않았지만 나머지는 정결합니다.

Question

참고하십시오 - 나는 파일을 열거 나 읽는 "올바른"방법을 찾지 않거나 매번 파일을 열거 나 읽어야하는 방법을 찾고 있지 않습니다. 나는 단지 대부분의 사람들이 어떤 방법으로 사용하는지 알아내는 데 관심이 있으며, 동시에 몇 가지 새로운 방법을 배울 것입니다.) *

필자의 Perl 프로그램에서 매우 일반적인 코드 블록은 파일을 열고 읽거나 쓰는 것입니다. 나는이 일을하는 데 너무나 많은 방법을 보았으며,이 일을 수행함에있어서의 나의 스타일은 몇 년에 걸쳐 몇 번 바뀌었다. 나는 최선의 방법 (최선의 방법이 있다면)이 이것을하는 것이 무엇인지 궁금 할 뿐이다.

나는 다음과 같은 파일을 여는 데 사용했다.

my $input_file = "/path/to/my/file";
open INPUT_FILE, "<$input_file"  || die "Can't open $input_file: $!\n";

하지만 오류 트래핑에 문제가 있다고 생각합니다.

괄호를 추가하면 오류 트래핑을 수정하는 것으로 보입니다.

open (INPUT_FILE, "<$input_file")  || die "Can't open $input_file: $!\n";

나는 또한 변수에 파일 핸들을 할당 할 수 있다는 것을 알고 있으므로, 위와 같이 "INPUT_FILE"을 사용하는 대신 $ input_filehandle을 사용할 수있었습니다.

파일을 읽는 경우, 작 으면 globbing에 문제가 있습니까?

my @array = <INPUT_FILE>;

또는

my $file_contents = join( "\n", <INPUT_FILE> );

또는 다음과 같이 항상 반복해야합니다.

my @array;
while (<INPUT_FILE>) {
  push(@array, $_);
}

나는 perl에서 일을 성취 할 수있는 많은 방법이 있다는 것을 알고있다. 파일을 열거 나 읽는 데 선호 / 표준 방법이 있는지 궁금하다.




이 프로그램이 귀하의 생산성을위한 것이라면 무엇이든 작동합니다! 자신이 필요하다고 생각하는만큼 많은 오류 처리를 구축하십시오.

전체 파일을 읽는 것이 장기간에 가장 좋은 방법 일 수는 없으므로 줄을 배열로로드하는 대신 처리하는 것이 좋습니다.

The Pragmatic Programmer (Hunt & Thomas)의 한 장에서 얻은 팁 중 하나는 스크립트를 사용하여 파일을 백업 한 후 분할 및 다이 싱 작업을 수행하기를 원할 수 있다는 점입니다.




Perl에서 파일을 열 수있는 가장 좋은 방법이 많이 있다는 것은 사실입니다.

$files_in_the_known_universe * $perl_programmers

...하지만 누가 보통 어떤 방식으로 하는지를 보는 것은 여전히 ​​흥미 롭습니다. 한 번에 전체 파일을 읽는 내 선호하는 형태의 slurping은 다음과 같습니다.

use strict;
use warnings;

use IO::File;

my $file = shift @ARGV or die "what file?";

my $fh = IO::File->new( $file, '<' ) or die "$file: $!";
my $data = do { local $/; <$fh> };
$fh->close();

# If you didn't just run out of memory, you have:
printf "%d characters (possibly bytes)\n", length($data);

그리고 일렬로 갈 때 :

my $fh = IO::File->new( $file, '<' ) or die "$file: $!";
while ( my $line = <$fh> ) {
    print "Better than cat: $line";
}
$fh->close();

주의 사항 강사 : 물론 일상적인 업무를위한 근육 기억에 대한 접근 방식 일 뿐이며 해결하려는 문제에 근본적으로 부적합 할 수 있습니다.




Damian Conway는 이렇게합니다.

$data = readline!open(!((*{!$_},$/)=\$_)) for "filename";

하지만 나는 너에게 그걸 추천하지 않는다.




한번은

open (FILEIN, "<", $inputfile) or die "...";
my @FileContents = <FILEIN>;
close FILEIN;

정기적 인 상용구. 요즘에는 File::Slurp 를 사용하여 메모리에 완벽하게 보관하려는 작은 파일을, Tie::File 은 크기를 조정할 큰 파일 및 / 또는 원하는 위치에 파일을 저장하려고합니다.




파일이 작아 메모리 전체를 읽을 수 있다면 File::Slurp . 아주 간단한 API를 사용하여 전체 파일을 읽고 씁니다. 모든 오류 검사를 수행하므로 필요하지 않습니다.




Links