Perl警告:在串联(。)或字符串中使用未初始化的值

时间:2013-07-08 13:56:20

标签: regex perl

我无法弄清楚为什么正则表达式模式不匹配。此外,输出抱怨$found未初始化,但我相信我这样做了。到目前为止,这是我的代码:

use strict;
use warnings;

my @strange_list = ('hungry_elephant', 'dancing_dinosaur');

my $regex_patterns = qr/
    elephant$
    ^dancing
    /x;

foreach my $item (@strange_list) {
    my ($found) = $item =~ m/($regex_patterns)/i;
    print "Found: $found\n";
}

以下是我得到的输出:

Use of uninitialized value $found in concatenation (.) or string at C:\scripts\perl\sandbox\regex.pl line 13.
Found:
Use of uninitialized value $found in concatenation (.) or string at C:\scripts\perl\sandbox\regex.pl line 13.
Found:

我是否需要以其他方式初始化$found?另外,我是否正确创建了一个多行字符串来解释为正则表达式?

非常感谢。

3 个答案:

答案 0 :(得分:17)

如果模式匹配(=~)与任何内容都不匹配,则标量$found中不会存储任何内容,因此Perl抱怨您正在尝试插入未给出的变量值。

除非有条件:

,否则您可以使用postfix轻松解决此问题
$found = "Nothing" unless $found
print "Found: $found\n";

如果上面的代码还没有值,则上面的代码会将值“Nothing”分配给$found 。现在,无论是哪种情况,您的print语句都将始终正常工作。

您也可以使用简单的if语句,但这似乎更详细:

if( $found ) {
   print "Found: $found\n";
}
else {
   print "Not found\n";
}

另一个可能最干净的选项是将模式匹配放在if语句中:

if( my ($found) = $item =~ m/($regex_patterns)/i ) {
   # if here, you know for sure that there was a match
   print "Found: $found\n";
}

答案 1 :(得分:2)

您的正则表达式缺少分隔符。在大象和舞蹈之间插入|

此外,只有在找到任何内容时才应打印Found。你可以通过

解决这个问题
print "Found: $found\n" if defined $found;

答案 2 :(得分:0)

Double forward slash//)也可用于初始化$found。它与unless非常相似。唯一要做的是修改print行,如下所示。

print "Found: " . ($found // 'Nothing') . "\n";

如果$found未初始化,则“没有”'将被打印。

结果(Perl v5.10.1):

Found: Nothing
Found: Nothing