$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Vorrei davvero che lo script perl fallisse quando il file non esiste. Qual è il modo "corretto" per far fallire -p o -n quando il file di input non esiste?
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Vorrei davvero che lo script perl fallisse quando il file non esiste. Qual è il modo "corretto" per far fallire -p o -n quando il file di input non esiste?
Risposte:
L' opzione -p è solo una scorciatoia per racchiudere il codice (l'argomento che segue -e) in questo ciclo:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
(-n è lo stesso ma senza il blocco continue.)
L' <>
operatore vuoto equivale a readline *ARGV
, e questo apre ogni argomento in successione come file da cui leggere. Non c'è modo di influenzare la gestione degli errori di quell'implicito aperto, ma puoi rendere l' avviso che emette fatale (nota, questo influenzerà anche diversi avvisi relativi all'opzione -i):
perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok
The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
inplace
è la categoria; senza di essa, -Mwarnings=FATAL
significa FATAL => all
, che non vogliamo. fatto.
Posiziona un flag nel corpo del loop, controlla il flag nel blocco END alla fine del puntale.
perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2
Si noti che non riesce solo quando nessun file è stato elaborato.
Per segnalare il problema quando non sono stati trovati tutti i file, è possibile utilizzare qualcosa di simile
perl -pe 'BEGIN{ $files = @ARGV} $found++ if eof; ... ;END {die "Some files not found" unless $files == $found}'
BEGIN{die "File not found" unless -f $ARGV[0]}
. (Dico più leggero, perché non implica l'impostazione di una bandiera e l'aggiunta di 2 pezzi di codici)