Girdi dosyası bulunamadığında perl betiğini (-n / -p ile çalıştırın) başarısızlığa uğratmak en iyisi (deyimsel olarak)?


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

Perl betiğinin dosya olmadığında başarısız olmasını gerçekten istiyorum. Girdi dosyası yoksa -p veya -n yapmanın "uygun" yolu nedir?

Yanıtlar:


6

-P anahtarı bu döngüde kodunuzu (argüman şu -e) sarmak için sadece bir kısayoldur:

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

(-n aynı ancak devam bloğu olmadan.)

<>Boş operatör eşdeğerdir readline *ARGV, ve bu okunan bir dosya olarak art arda her bir bağımsız değişken açar. Örtülü açıkın hata işlemesini etkilemenin bir yolu yoktur, ancak ölümcül yaydığı uyarıyı ölümcül yapabilirsiniz (not, bu -i anahtarıyla ilgili birkaç uyarıyı da etkileyecektir):

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

@MarkReed inplace, ilgilendiğimiz uyarılar kategorisidir. Diğer uyarıları etkilemek için bir neden yoktur.
Grinnz

Gönderen uyarılar :The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
Grinnz

Doğru, inplacekategori; onsuz, istemediğimiz -Mwarnings=FATALanlamına gelir FATAL => all. anladım.
Mark Reed

4

Döngünün gövdesine bir bayrak yerleştirin, bağlantının sonundaki END bloğundaki bayrağı kontrol edin.

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

Yalnızca hiçbir dosya işlenmediğinde başarısız olduğunu unutmayın.

Tüm dosyalar bulunamadığında sorunu bildirmek için aşağıdaki gibi bir şey kullanabilirsiniz:

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

1
Betiğinizin dosyaları stdin'den okumak yerine argüman olarak alması gerekiyorsa, bu çözüme daha hafif bir alternatif olacaktır BEGIN{die "File not found" unless -f $ARGV[0]}. (Daha hafif diyorum, çünkü bayrak ayarlamayı ve 2 parça kod eklemeyi içermiyor)
Dada

Ayrıca tüm dosyaların sıfır olmayan uzunlukta olduğunu varsayar.
Tanktalus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.