在Perl代码中查找数据点生成错误
我有一个Perl程序,它一次从数据文件中读取一行数据,并为每行数据计算某些统计数据。有时,当程序读取我的数据集时,我会收到一条关于在Perl代码中查找数据点生成错误,perl,variables,runtime-error,warnings,Perl,Variables,Runtime Error,Warnings,我有一个Perl程序,它一次从数据文件中读取一行数据,并为每行数据计算某些统计数据。有时,当程序读取我的数据集时,我会收到一条关于…未初始化值…的警告,我想知道哪行数据会生成此警告。 有什么方法可以让Perl打印(到屏幕或文件中)生成错误的数据点吗?如果脚本为每一个输入行打印一行,则通过将标准错误与输出一起刷新(使消息显示在“右”点)更容易看到错误发生的时间: 也就是说,打开perl自动刷新功能,如中所述 (自动)冲洗功能: 错误消息被写入预定义的STDERR流,普通printf被写入(默认)
…未初始化值…
的警告,我想知道哪行数据会生成此警告。
有什么方法可以让Perl打印(到屏幕或文件中)生成错误的数据点吗?如果脚本为每一个输入行打印一行,则通过将标准错误与输出一起刷新(使消息显示在“右”点)更容易看到错误发生的时间: 也就是说,打开perl自动刷新功能,如中所述 (自动)冲洗功能:
- 错误消息被写入预定义的STDERR流,普通printf被写入(默认)预定义的STDOUT
- 在这些流上写入的数据由系统保存(在Perl的控制下)以成片写入(称为“缓冲区”),以提高效率
- STDERR和STDOUT缓冲区是独立的,可以逐行写入,也可以通过缓冲区写入(许多字符,不一定是行)
- 使用autoflush告诉Perl修改其写入缓冲区的方案,以便在print/printf调用结束时通过操作系统写入缓冲区的内容
- 通常,STDERR是逐行写入的。该命令告诉Perl为当前/默认流(即STDOUT)启用此功能
- 这样做会使它们都逐行写入,以便通过其中一个发送的消息在脚本的输出中显示在一起
- 错误消息被写入预定义的STDERR流,普通printf被写入(默认)预定义的STDOUT
- 在这些流上写入的数据由系统保存(在Perl的控制下)以成片写入(称为“缓冲区”),以提高效率
- STDERR和STDOUT缓冲区是独立的,可以逐行写入,也可以通过缓冲区写入(许多字符,不一定是行)
- 使用autoflush告诉Perl修改其写入缓冲区的方案,以便在print/printf调用结束时通过操作系统写入缓冲区的内容
- 通常,STDERR是逐行写入的。该命令告诉Perl为当前/默认流(即STDOUT)启用此功能
- 这样做会使它们都逐行写入,以便通过其中一个发送的消息在脚本的输出中显示在一起
>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.
>echo hello | perl-lnwe“打印$x”
名称“main::x”只使用了一次:可能在-e第1行输入错误。
在-e第1行第1行的打印中使用未初始化值$x。
因此,如果您在阅读时进行计算,您会得到相应的警告。Perl通常在默认情况下在警告中包含文件句柄和行号;i、 e
>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.
>echo hello | perl-lnwe“打印$x”
名称“main::x”只使用了一次:可能在-e第1行输入错误。
在-e第1行第1行的打印中使用未初始化值$x。
因此,如果您在阅读时进行计算,您会得到相应的警告。为了回答您的问题,我的代码读取一行值,计算某些统计数据并将其写入输出文件;然后从数据文件中取出下一行,读取它,等等。。我对“刷新”会对我的代码做什么感到有点困惑:它是应该将错误消息添加到我的输出文件中,还是应该在程序读取数据文件时在屏幕上打印导致错误的数据行?我从你的回答中学到了很多;我现在将尝试在我的代码中实现它!为了回答您的问题,我的代码读入一行值,计算某些统计数据并将它们写入输出文件;然后从数据文件中取出下一行,读取它,等等。。我对“刷新”会对我的代码做什么感到有点困惑:它是应该将错误消息添加到我的输出文件中,还是应该在程序读取数据文件时在屏幕上打印导致错误的数据行?我从你的回答中学到了很多;我现在将尝试在我的代码中实现它!但是,这不告诉我代码中的行吗?我想知道数据集中哪一行产生了错误…它应该告诉你们两个。请注意,我的代码生成了2个警告。第一次发生在编译时,因此它只给出脚本(-e)中的行。第二个给出了脚本(-e第1行)和文件句柄(第1行),因为它发生在打开并从中读取的过程中。我还没有弄明白为什么,在我的例子中,Perl只告诉我代码的行,而不是生成错误的数据集中的行:你有什么想法/建议吗?但是,这不是告诉我代码中的行吗?我想知道数据集中哪一行产生了错误…它应该告诉你们两个。请注意,我的代码生成了2个警告。第一次发生在编译时,因此它只给出脚本(-e)中的行。第二个给出了脚本(-e第1行)和文件句柄(第1行),因为它发生在打开并从中读取的过程中。我还没有弄清楚为什么,在我的例子中,Perl只告诉我代码的行,而不是生成错误的数据集中的行:你有什么想法/建议吗?