Perl:打印do()的编译警告

1bqhqjot  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(159)

我正在使用do()来执行一个Perl脚本。我想确保它执行了正确的错误检查,但是我注意到当我使用do()时,警告没有被打印出来。我故意在我的脚本中留下了以下警告。当我在命令行上运行它时,我看到了它

Useless use of numeric eq (==) in void context at utils/queryEvent/query_event.pl line 47.

当我使用do()时,这个消息被抑制了。我在perlvar中看到$@不包含警告,所以我试图在调用do()之前添加这个消息,但是我仍然没有看到任何东西。

local $SIG{__WARN__} = sub {
    print "Warning @_\n";
};
do(...);

有没有办法仍然可以打印编译/解析警告?
我在Windows 10上使用的是Perl v.5.22.1。

添加的编辑:

调用do()的脚本和通过do()运行的脚本都有use strict;use warnings;。只有解析警告没有显示。如果我在do脚本中调用warn,那么我会看到(我假设是stderr)。

编辑:

添加示例脚本。
最小可重现版本如下

use strict;
use warnings;

sub test
{
    return 1;
}

main:
{
    (test() == 1);
}

调用脚本

use strict;
use warnings;

main:
{
    do('test.pl');
}
bvjveswy

bvjveswy1#

您错了。do对警告没有任何影响。
没有警告,因为没有任何东西会引起警告。(test() == 1)不在void上下文中求值。相反,它的结果由do返回。
但是,当警告没有被静音时,异常也被静音了。解决这个问题将解决另一个问题。
将尾随的1添加到由do加载的文件中,并按如下所示更改do

do('test.pl')
   or die( "Can't execute `./test.pl`: ".( $@ // $! ) );

尾随的1用于向“调用者”发出是否发生错误的信号。这有一个副作用,即导致(test() == 1)按预期在void上下文中求值。

envsm3lx

envsm3lx2#

-w-W命令行开关将在整个程序中启用警告,包括通过do语句包含的代码。

相关问题