Я играю с lines
, который читает строки из файлов, которые вы указали в командной строке:
for lines() { put $_ }
Если он не может прочитать один из имен файлов, он бросает X::AdHoc
(в один прекрасный день, возможно, у него будут лучшие типы исключений, чтобы мы могли захватить имя файла с помощью метода .path
). Отлично, так поймите, что:
try {
CATCH { default { put .^name } }
for lines() { put $_ }
}
Таким образом, это улавливает ошибку X::AdHoc
, но это. Блок try
выполняется в этой точке. Он не может .resume
и попробуйте следующий файл:
try {
CATCH { default { put .^name; .resume } } # Nope
for lines() { put $_ }
}
Вернитесь на сервер Perl 5, вы получите предупреждение о неправильном имени файла, и программа перейдет к следующему.
Я мог бы фильтровать @*ARGS
сначала, а затем восстановить $*ARGFILES
, если есть некоторые аргументы:
$*ARGFILES = IO::CatHandle.new:
@*ARGS.grep( { $^a.IO.e and $^a.IO.r } ) if [email protected]*ARGS;
for lines() { put $_ }
Это работает, хотя он молча игнорирует плохие файлы. Я мог бы справиться с этим, но немного утомительно обрабатывать список аргументов, включая -
для стандартного ввода в качестве имени файла и по умолчанию без аргументов:
my $code := { put $_ };
@*ARGS = '-' unless [email protected]*ARGS;
for @*ARGS -> $arg {
given $arg {
when '-' { $code.($_) for $*IN.lines(); next }
when ! .IO.e { note "$_ does not exist"; next }
when ! .IO.r { note "$_ is not readable"; next }
default { $code.($_) for $arg.IO.lines() }
}
}
Но это много работы. Есть ли более простой способ справиться с этим?