2009-09-25 3 views
44

나는 펄 open 기능에 대한 두 가지 질문을 가지고는 :왜 autovivified 파일 핸들을 사용하는 세 인자로 열린 호출이 Perl의 가장 좋은 방법입니까?

1) 나는 open의 3 인자 버전은, 예를 들어, 두 개의 인수 버전보다 낫다는 것을 펄 모범 사례에서 기억하는 것

open(OUT, ">>$file"); 

왜 그

open(OUT, '>>', $file); 

대입니까? 나는 다른 누군가에게 3 인자 버전을 사용하라고 말하려고했지만 아무 것도지지 할 수 없었습니다.

2) 나는 또한 자동화된 파일 핸들이 베어 어드 파일 핸들보다 선호된다는 것을 기억하고있는 것 같다. 그 이유를 기억하지 못했습니다.

open(my $out, '>>', $file); 

open(OUT, '>>', $file); 

는 그것을 strict 것입니까? 나는 OUTstrict과 함께 사용할 수 있다는 것을 기억하는 것 같지만 기억이 안납니다.

+0

위도 : http://stackoverflow.com/questions/318789/whats-the-best-way-to-open-and-read-a-file-in-perl – Ether

+1

Perl :: Critic advices this :) –

+3

사기꾼이 아니라 왜 이것이 최선의 방법인지 묻고 있습니다. –

답변

62
  • 사용 typeglobs (OUT을 같은) 좋은 생각이 아니다 :

    OUT는이 같은 교활한 버그를 노출하는 글로벌 핸들과 사용 모듈 전체를 포함하여 다른 루틴이 같은 이름을 사용하고 있는지 확인해야합니다 (미래 포함).

  • 두 개의 인수 형식 open을 사용하면 응용 프로그램이 특수 문자가 포함 된 변수로 인해 잘못 행동하는 것을 나타냅니다. 예를 들어 my $f; open $f, ">$some_filename";>을 포함하는 $some_filename이 포함 된 버그에 노출되어 프로그램의 동작이 변경됩니다.

3 인수 형식을 사용하면 모드와 파일 이름을 간섭하지 않는 별도의 인수로 분리하여이를 피할 수 있습니다. 파이프 형성 많은-의-인수 (가) 아주 좋은 생각입니다 사용 또한

:

open $pipe, '|-', 'sendmail', '[email protected]'; 

는 하나의 문자열로 모든 것을하는 것보다 더 나은가요는 - 그것은 등 가능한 쉘 주입을 방지

+1

감사 마크. 그것은 제가 찾고 있던 답의 집합이었습니다. 다행스럽게도 지난 몇 년 동안 그렇게해온 합법적 인 이유가 있음을 알고 있습니다. – Morinar

+3

호환성에 대한 참고 사항 : 3-arg open 및'open $ fh, ... '작업은 5.6.0에서 시작됩니다. 'open $ fh, '| -', LIST' (list pipe open)은 5.8.0부터 작동합니다. – hobbs

+1

알려진 내용의 리터럴에 추한 형태의 파이프 열기를 사용할 이유는 없습니다. 또한 복잡한 파이프 라인의 쉘 처리를 중단합니다. 나쁜 나쁜. – tchrist

14

달려 들기 # 2 : 파일 핸들에 대한

sub doSomething { 
    my ($input) = @_; 
    # let's compare $input to something we read from another file 
    open(F, "<", $anotherFile); 
    @F = <F>; 
    close F; 
    &do_some_comparison($input, @F); 
} 

open(F, "<", $myfile); 
while (<F>) { 
    &doSomething($_); # do'h -- just closed the F filehandle 
} 
close F; 
+0

아, 매우 견고한 추론입니다. – Morinar

12

두 가지 인수 형식이 깨졌습니다. 'abc'라는 파일 (앞에 공백이있는 파일 이름)을 고려하십시오. 파일을 열 수 없습니다.

open my $foo, ' abc' or die $!; 
open my $foo, '< abc' or die $!; 
open my $foo, '< abc' or die $!; 
# nothing works 

공간이 삭제되어 더 이상 파일을 찾을 수 없습니다. 그러한 시나리오는 매우 희박하지만 분명히 문제입니다.세, 인수의 형태는이에 면역 : perlmonks에서

open my $foo, '<', ' abc' or die $!; 
# works 

This thread 문제의만큼 좋은 토론입니다. 2001 년에 3 가지 인수 형식은 새로운으로 간주되어서 5.005 인터프리터에서 실행될 경우 Perl 프로그램이 구문 오류로 인해 종료되므로 이식 가능한 코드에는 적합하지 않습니다. 이것은 더 이상 해당하지 않습니다. perl 5.005는 더 이상 사용되지 않으며 더 이상 사용되지 않습니다.

+16

아니요, 두 인수 형식의 open 또는 그 인수에 대한 하나의 인수 형식은 * 깨지지 * 않습니다. 그것은 설계, 문서화, 그리고 광고로 일하고 있습니다. 그것은 단순히 * 마술 공개 * 당신이 필요로하지 않을 수 있습니다. 세 가지 인자가있는 또 다른 플러그는 중간 인수가 스트림의 인코딩을 포함 할 수 있으며 종종 포함해야한다는 것입니다. – tchrist

관련 문제