我正在使用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');
}
2条答案
按热度按时间bvjveswy1#
您错了。
do
对警告没有任何影响。没有警告,因为没有任何东西会引起警告。
(test() == 1)
不在void上下文中求值。相反,它的结果由do
返回。但是,当警告没有被静音时,异常也被静音了。解决这个问题将解决另一个问题。
将尾随的
1
添加到由do
加载的文件中,并按如下所示更改do
:尾随的
1
用于向“调用者”发出是否发生错误的信号。这有一个副作用,即导致(test() == 1)
按预期在void上下文中求值。envsm3lx2#
-w
或-W
命令行开关将在整个程序中启用警告,包括通过do
语句包含的代码。