Perl抱怨正则表达式中未初始化的值

时间:2011-10-11 21:21:51

标签: perl

我有以下功能:

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时抱怨未初始化的值?

2 个答案:

答案 0 :(得分:1)

不是。它抱怨这条线:

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

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

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

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

答案 1 :(得分:0)

实际上$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"