我正在玩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 +@*ARGS;
for lines() { put $_ }
虽然它会默默地忽略坏文件,但它仍然有效。我可以处理这个问题,但是自己处理参数列表有点乏味,包括-
对于作为文件名的标准输入和不带参数的默认输入:
my $code := { put $_ };
@*ARGS = '-' unless +@*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() }
}
}
但这是一项繁重的工作。有没有更简单的方法来处理这个问题?