【问题标题】:Perl Global variable uninitializedPerl 全局变量未初始化
【发布时间】: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


【解决方案1】:

当您到达文件末尾时,$line = &lt;CSV&gt; 会将未定义的值分配给 $line。通常的习惯用法是在继续之前检查 readline 函数(由 &lt;&gt; 运算符隐式调用)是否返回了一个好的值...

 while (my $line = <CSV>) {
     # guaranteed that $line has a defined value
     ...
 }

但是你的调用顺序,你正在避免那个检查。即使&lt;CSV&gt; 没有返回一个好的值,您当前的代码也会增加$lineCount,这也可能不是您想要的。

【讨论】:

  • 你应该提到,当你按照你的方式编写时,perl的优化器会将while循环重写为while (defined(my $line = &lt;CSV&gt;)) {...},这是定义的测试的来源,因为while循环通常只测试一个true价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多