$ 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?
$ 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?
Odpowiedzi:
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
inplace
jest kategoria; bez niego -Mwarnings=FATAL
oznacza to FATAL => all
, czego nie chcemy. Rozumiem.
Ustaw flagę w treści pętli, zaznacz flagę w bloku END na końcu onelinera.
perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2
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
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]}
. (Mówię lżejsze, ponieważ nie wymaga to ustawiania flagi i dodawania 2 kodów)