Perl:打开还是[代码块]?

时间:2017-03-10 10:49:11

标签: perl

我正在运行脚本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;正确使用它。

3 个答案:

答案 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放入模块中,并且使用userequire加载它并使用clear直接调用其中的函数,我认为您将获得更清晰的代码并减少陷阱参数。

您在这里缺少的是do幕后涉及eval,这会导致异常混乱。您可以通过将脚本B代码移动到模块中的函数并调用它来或多或少地避免这种混淆。

(此外,由于安全问题,perl 5.26将对do进行轻微打嗝,其中当前目录将从目录查找中删除。userequire具有相同的权限打嗝,但这可能不那么令人惊讶,因为您应该将模块放入明确进入@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: ". ( $@ || $! );