在Perl代码中查找生成错误的数据点

时间:2015-02-14 02:11:37

标签: perl variables runtime-error warnings

我在Perl中有一个程序,它从数据文件中一次读取一行,并为每行数据计算某些统计信息。不时地,当程序读取我的数据集时,我收到关于...uninitialized value...的警告,我想知道哪一行数据会产生此警告。 有什么方法可以告诉Perl打印(屏幕或文件)产生错误的数据点?

2 个答案:

答案 0 :(得分:4)

如果您的脚本为每个输入行打印一行,通过将标准错误与输出一起刷新(使消息显示在“右侧”点),可以更容易地查看错误发生的时间:

$| = 1;

也就是说,打开perl autoflush功能,如How to flush output to the console?

中所述

什么(自动)冲洗:

  • 错误消息写入预定义的STDERR流,普通printf转到(默认)预定义STDOUT。
  • 写在这些流上的数据由系统保存(在Perl的控制下)以块(称为“缓冲区”)写出,以提高效率。
  • STDERR和STDOUT缓冲区是独立的,可以逐行写入或通过缓冲区写入(许多字符,不一定是行)。
  • 使用autoflush告诉Perl修改其写缓冲区的方案,以便在print / printf调用结束时通过操作系统写入它们的内容。
  • 通常STDERR是逐行写入的。该命令告诉Perl为当前/默认流启用此功能,即STDOUT。
  • 这样做会让他们两个一行一行地写,以便通过 close 及时发送的消息在脚本输出中一起显示 close 。 / LI>

答案 1 :(得分:2)

默认情况下,Perl通常包含警告中的文件句柄和行号;即。

>echo hello | perl -lnwe 'print $x'
Name "main::x" used only once: possible typo at -e line 1.
Use of uninitialized value $x in print at -e line 1, <> line 1.

因此,如果您在阅读时进行计算,则会收到相应的警告。