14

我无法弄清楚为什么正则表达式模式不匹配。此外,输出抱怨$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其他方式初始化吗?另外,我是否正确地创建了一个多行字符串来解释为正则表达式?

非常感谢。

4

3 回答 3

17

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

除非有条件,否则您可以使用后缀轻松解决此问题:

$found = "Nothing" unless $found
print "Found: $found\n";

$found 上面的代码仅在它还没有值时才将值“Nothing”分配给它。现在,无论哪种情况,您的 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";
}
于 2013-07-08T14:00:39.947 回答
2

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

Found此外,只有在真正找到任何东西时才应该打印。您可以通过以下方式解决此问题

print "Found: $found\n" if defined $found;
于 2013-07-08T14:05:17.973 回答
0

双正斜杠( //) 也可用于初始化$found。它与 非常相似unless。唯一要做的就是print如下修改该行。

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

如果$found未初始化,将打印“Nothing”。

结果(Perl v5.10.1):

Found: Nothing
Found: Nothing
于 2017-10-05T18:37:18.320 回答