【发布时间】:2012-04-03 21:35:39
【问题描述】:
以下面的废话脚本为例:
use strict;
use warnings;
my $uninitialisedValue;
while(<>){
print ${$uninitialisedValue}{$_},"\n";
}
从命令行运行:
$ perl warningPrinter.pl < longfile.txt
无论标准输入包含什么,标准输出都会充满:
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 1.
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 2.
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 3.
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 4.
...
我使用非常长的文件,因此在测试我的脚本时将其作为输出接收至少会有点烦人。进程响应 Ctrl + C 终止信号可能需要一段时间,并且我的终端突然充满了相同的错误消息。
有没有办法让 Perl 只打印相同且重复出现的警告消息的第一个实例,或者只使警告消息对脚本的执行造成致命影响?鉴于尽管有警告,但我从未制作过有效的脚本,所以我会接受。但如果我能让 Perl 只打印一次相同的警告,可能会更方便。
【问题讨论】:
-
试试这个 StackOverflow 的另一个帖子:[How can I make Perl die if a warning is generated?][1] [1]: stackoverflow.com/questions/3896060/…
-
优秀。
use warnings FATAL => 'all'非常适合在我收到警告后终止进程。 -
在读取文件时不要使用
for,尤其是当文件很大时,因为 for 循环会将其列表预加载到内存中。请改用while。此外,将文件重定向到标准输入是多余的,只需使用文件作为参数。在您的特定问题中,将 STDERR 重新打开到文件可能是一种解决方案。 -
哦,糟糕,我的意思是
while:p。但是,我发现从 STDIN 读取代码更快,并且脚本将自动与来自另一个进程的管道兼容。如果我只是从命令行获取一个参数,我将不得不检查用户是否真的想从 STDIN 读取。 -
@kikumbob 菱形运算符适用于 STDIN 或文件参数。你的区分是无效的。使用
script.pl < file和script.pl file与使用菱形运算符<>时相同。