입력 파일을 찾을 수 없을 때 펄 스크립트 (-n / -p로 실행)를 실패하는 가장 좋은 방법은 무엇입니까?


11
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok

파일이 없으면 펄 스크립트가 실패하고 싶습니다. 입력 파일이 없을 때 -p 또는 -n을 실패시키는 "적절한"방법은 무엇입니까?

답변:


6

-p 스위치는 이 루프 코드 (인수 다음 -e)을 포장 단지 바로 가기입니다 :

LINE:
  while (<>) {
      ...             # your program goes here
  } continue {
      print or die "-p destination: $!\n";
  }

(-n은 동일하지만 continue 블록이 없습니다.)

<>빈 연산자는 동등 readline *ARGV하고, 즉, 읽을 수있는 파일로 연속적으로 각 인자를 연다. 암시 적 열기의 오류 처리에 영향을 줄 수있는 방법은 없지만 치명적인 경고를 만들 수 있습니다 (이는 -i 스위치와 관련된 여러 가지 경고에도 영향을 미칩니다).

perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok

@MarkReed inplace는 관심있는 경고 범주입니다. 다른 경고에 영향을 줄 이유가 없습니다.
그린 즈

에서 경고 :The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
Grinnz

맞습니다 inplace. 카테고리입니다. 그것없이 -Mwarnings=FATAL수단 FATAL => all, 어떤 우리는 원하지 않는다. 알았다.
Mark Reed

4

루프 본문에 플래그를 설정하고 oneliner 끝의 END 블록에서 플래그를 확인하십시오.

perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2

파일이 처리되지 않은 경우에만 실패합니다.

모든 파일을 찾을 수 없을 때 문제를보고하려면 다음과 같은 것을 사용할 수 있습니다.

perl -pe 'BEGIN{ $files = @ARGV} $found++ if eof; ... ;END {die "Some files not found" unless $files == $found}'

1
스크립트가 stdin에서 읽지 않고 인수로 파일을 가져 오려는 경우이 솔루션의 간단한 대안은 다음과 같습니다 BEGIN{die "File not found" unless -f $ARGV[0]}. (플래그를 설정하고 코드 2 개를 추가하지 않기 때문에 더 밝게 말합니다)
Dada

또한 모든 파일의 길이가 0이 아닌 것으로 가정합니다.
Tanktalus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.