$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Naprawdę chciałbym, aby skrypt Perla zawiódł, gdy plik nie istnieje. Jaki jest „właściwy” sposób, aby polecenie -p lub -n nie powiodło się, gdy plik wejściowy nie istnieje?
Przełącznik -p to tylko skrót do owijania swój kod (argument następujący -e) w tej pętli:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
(-n jest taki sam, ale bez bloku kontynuacji).
<>
Operator pusty odpowiada readline *ARGV
i który otwiera każdy argument z rzędu w postaci pliku do odczytu z. Nie ma sposobu, aby wpłynąć na obsługę błędów tego niejawnego otwarcia, ale można ustawić ostrzeżenie, które emituje błąd (uwaga, wpłynie to również na kilka ostrzeżeń związanych z przełącznikiem -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
jest kategoria; bez niego-Mwarnings=FATAL
oznacza toFATAL => all
, czego nie chcemy. Rozumiem.Ustaw flagę w treści pętli, zaznacz flagę w bloku END na końcu onelinera.
Pamiętaj, że kończy się niepowodzeniem tylko wtedy, gdy żaden plik nie został przetworzony.
Aby zgłosić problem, gdy nie wszystkie pliki zostały znalezione, możesz użyć czegoś takiego
źródło
BEGIN{die "File not found" unless -f $ARGV[0]}
. (Mówię lżejsze, ponieważ nie wymaga to ustawiania flagi i dodawania 2 kodów)