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

Perl抱怨正则表达式中的未初始化值,perl,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 = spli

我有一个功能如下:

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*/) {
elsif ($min =~ /((\w+),)+/) {

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

不是。它在抱怨这句话:

if ($param =~ /\s*\[(\S+),\s*(\S+)\]\s*/) {
elsif ($min =~ /((\w+),)+/) {
至少这里有测试数据
120u、421u、53、19、41u、53

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


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

不是。它抱怨这行:

if ($param =~ /\s*\[(\S+),\s*(\S+)\]\s*/) {
elsif ($min =~ /((\w+),)+/) {
至少这里有测试数据
120u、421u、53、19、41u、53

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


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

实际上是
$min
未定义,当您使用
严格
警告
时会报告它。这修复了它:

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"

它实际上是未定义的
$min
,当您使用
严格的
警告时会报告它。这修复了它:

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解释器会抱怨“if”而不是“elsif”这实际上是造成问题的原因。我的代码顶部也有使用警告。@AlvinHo:我不是通灵者。但是,在我的系统上,错误消息包括正确的行号以及在模式匹配(m/)中使用未初始化值$min的相关语句在./test.pl第16行。
现在我猜您可能会因为here文档、一种或一种特殊的启动脚本的方式(不直接在源文件上按原样(?).Oh和linecontinuation字符(在here文档中?)@阿尔文,首先,没有所谓的
elsif
语句。其次,
if
在很多年前就已经被特殊处理过了,可以在中途发出警告。升级你的Perl。@ikegami:谢谢你提出了可能的现实生活解释:)这本应该已经读过了“没有所谓的
elsif
语句,所以不能说警告不是来自
if
”我刚刚意识到了同样的问题……但我不明白……为什么Perl解释器会抱怨“if”而不是“elsif”“这实际上是造成问题的原因。我的代码顶部也有使用警告。@AlvinHo:我不是通灵者。但是,在我的系统上,错误消息包括正确的行号以及在模式匹配(m/)中使用未初始化值$min的相关语句
在./test.pl第16行。
现在我猜您可能会因为here文档、一种或一种特殊的启动脚本的方式(不直接在源文件上按原样(?).Oh和linecontinuation字符(在here文档中?)@阿尔文,首先,没有所谓的
elsif
语句。其次,
if
在很多年前就已经被特殊处理过了,可以在中途发出警告。升级你的Perl。@ikegami:谢谢你提出了可能的现实生活解释:)这本应该已经读过了没有
elsif
语句,因此不能说警告不是来自
if