【问题标题】:Perl complaining about uninitialized value in regexPerl 抱怨正则表达式中的未初始化值
【发布时间】:2011-12-05 16:04:21
【问题描述】:

我在下面有一个函数:

sub getMinFromParam {
    my ($param) = @_;

    print "PPPP = $param\n";

    my $min;
    if ($param =~ /\s*\[(\S+),\s*(\S+)\]\s*/) {
    print "IN HERE\n";
        $min = $1;
    }
    elsif ($min =~ /((\w+),)+/) {
        my @tmp = split (/\s*,\s*/, $param);
        if ($tmp[0] =~ /\[(\w+),\s?(\w+)\]/) {
            $min = $1;
        }
        else {
            $min = $tmp[0];
        }
    }
    return ($min);
}

当 $param 是一个字符串时:120u, 421u, 53, 19, 41u, 53, 我得到错误:在这一行的模式匹配(m//)中使用未初始化的值:

if ($param =~ /\s*\[(\S+),\s*(\S+)\]\s*/) {

为什么在定义 $param 时会抱怨未初始化的值?

【问题讨论】:

    标签: perl


    【解决方案1】:

    不是。它在抱怨这条线:

    elsif ($min =~ /((\w+),)+/) {
    

    至少这里有测试数据120u, 421u, 53, 19, 41u, 53

    这是预期的,因为 $min 仅在 $param 匹配时设置,但 elsif 仅在 $param 不匹配时运行。

    那行应该是elsif ($param =~ /((\w+),)+/) {,在这种情况下我不会收到警告。

    【讨论】:

      【解决方案2】:

      实际上是$min是未定义的,当你使用strictwarnings时会被报告。这解决了它:

      use strict;
      use warnings;
      
      sub getMinFromParam
      {
          my ($param) = @_;
      
          print "PPPP = $param\n";
      
          my $min;
          if ($param =~ /\s*\[(\S+),\s*(\S+)\]\s*/)
          {
              print "IN HERE\n";
              $min = $1;
          }
          elsif (defined $min && $min =~ /((\w+),)+/)
          {
              my @tmp = split (/\s*,\s*/, $param);
              if ($tmp[0] =~ /\[(\w+),\s?(\w+)\]/)
              {
                  $min = $1;
              }
              else
              {
                  $min = $tmp[0];
              }
          }
          return ($min);
      }
      
      getMinFromParam "120u, 421u, 53, 19, 41u, 53"
      

      【讨论】:

      • 我刚刚意识到同样的问题......但我不明白......为什么 Perl 解释器会抱怨实际上导致问题。我有使用警告;在我的代码顶部也是如此。
      • @AlvinHo:我不是通灵者。但是,在我的系统上,错误消息包括正确的行号以及相关声明 Use of uninitialized value $min in pattern match (m//) at ./test.pl line 16. 现在我猜你可能会因为这里的文档而得到一个破坏的行数,source filter或者不是直接在源文件上启动脚本的特殊方式(?)。哦,还有换行符(在 HERE 文档中?)
      • @Alvin,首先,没有 elsif 声明这样的东西。其次,if 已在多年前特例发出警告。升级你的 Perl。
      • @ikegami:感谢您提出可能的现实解释:)
      • 那应该是“没有elsif这样的声明,所以你不能说警告不是来自if。”
      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多