【发布时间】:2012-02-01 22:58:47
【问题描述】:
我是 perl 新手,所以请多多包涵。
我有一个解析 CSV 文件的脚本。为了让调试更容易,我使用了状态机 FSA::Rules(非常喜欢它)。
每件事都进展顺利,只是现在我需要让我的日志有意义,作为其中的一部分,我需要记录行号,所以我的程序看起来像这样。
my $line = '';
my $lineCount = 0;
sub do {
...
#CSV opened
...
#State machine stuff happens here
readLine;
if ($line =~ m/.*Pattern*/){
#do stuff
}
}
sub readLine{
$line = <CSV>;
$lineCount ++;
}
但我收到以下错误
Use of uninitialized value $line in pattern match (m//) at
有人知道为什么 $line 不会被初始化吗? 谢谢。
【问题讨论】:
-
这不是产生错误的代码。你从不调用子程序
do,也不应该将子程序命名为与保留字相同的名称,因为一方面,调用起来很尴尬。请显示失败的代码。您是否在sub do中再次声明my $line? -
$line 变量未初始化,因为 $line 的内容与提供的正则表达式不匹配。请在 #! 后添加
use strict;和use warnings;后发布您的所有代码!行(应该是脚本的第一行)。 -
@David:对不起?如果变量与正则表达式不匹配,则变量不会被初始化。并且
#!行不是必需的,甚至是不可取的(尽管严格和警告是!) -
如何检查文件结尾?如果你不这样做,出于某种奇怪的原因,那可能是你的错误。
-
#!在 Unix 中,行不是必需的,除非作为从命令行运行脚本的可选机制,而不必在其前面指定“
/usr/bin/perl”。
标签: perl