我正在运行脚本A,它将包含文件路径的ARGV提供给perl脚本B.这是通过
完成的。local @ARGV = ($file, $file2, etc.);
do scriptB.pl or die "scriptB has failed";
脚本B然后尝试打开文件:
open( my $fh_file, "<", $file )
or die "Could not open file '$file' $!";
但是,如果文件丢失,我不会在&#34;或者#34;之后引用消息。在B.相反,我在A中获取do scriptB.pl或die消息。如果我删除&#34;或者死掉&#34;从A开始,在B静静地死亡之后,脚本继续运行,就像没有出错一样。
我想知道是否有办法让B打印出它的消息?
更好的是,在B无法打开文件后运行代码块的最佳方法是什么?例如,所述代码将写入单独的文件,列出哪些文件丢失,以便用户可以轻松追踪此类错误。
#something like
open( my $fh_file, "<", $file) or {
print "the file could not be found";
die;
}
我在网上寻找帮助的唯一一件事就是有人提到了#34;或者做了{}&#34;但是这给了我奇怪的语法错误所以我不确定我是否#&# 39;正确使用它。
答案 0 :(得分:4)
如果您想继续使用open(...) or ...
语法,则可以使用do
。
open my $fh, '<', $file or do {
...
};
但我认为切换到if
if (! open my $fh, '<', $file) {
...
}
甚至是unless
unless (open my $fh '<', $file) {
...
}
答案 1 :(得分:1)
如果您将脚本B放入模块中,并且使用use
或require
加载它并使用clear直接调用其中的函数,我认为您将获得更清晰的代码并减少陷阱参数。
您在这里缺少的是do
幕后涉及eval
,这会导致异常混乱。您可以通过将脚本B代码移动到模块中的函数并调用它来或多或少地避免这种混淆。
(此外,由于安全问题,perl 5.26将对do
进行轻微打嗝,其中当前目录将从目录查找中删除。use
和require
具有相同的权限打嗝,但这可能不那么令人惊讶,因为您应该将模块放入明确进入@INC
加载路径的路径中。)
答案 2 :(得分:1)
die
不会打印消息; die
抛出异常。当您捕获该异常时,您不会对传递给die
的消息执行任何操作。取代
local @ARGV = ($file, $file2, etc.);
do scriptB.pl or die "scriptB has failed";
与
local @ARGV = ($file, $file2, etc.);
do scriptB.pl or die "scriptB has failed: ". ( $@ || $! );