2013-07-08 63 views
9

使用未初始化值的我想不通,为什么正则表达式模式不匹配。此外,输出抱怨$found未初始化,但我相信我是这样做的。这是我到目前为止的代码:Perl的警告:(。)的串联或串

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?此外,我正确地创建一个多行字符串解释为正则表达式?

非常感谢。

+1

你多行字符串被解释为'QR /大象$ ^跳舞/;'而你可能想'QR /大象$ | ^跳舞/; ' – user1937198

+0

对于多行匹配,使用/ m开关:'我的$ regex_patterns = QR /大象$ ^跳舞/ MX;' – shawnhcorey

回答

14

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

您可以通过使用后缀除非有条件解决这个问题很容易:

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

上面的代码值“没有”分配给$found只有如果它不已经有一个值。现在,无论在哪种情况下,您的打印语句都会正常工作。

你也只使用一个简单的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"; 
} 
+0

能不能请你告诉我怎么可以在我的正则表达式添加到包含您的线路为例,“除非” ? –

+0

@DirtyPenguin您的正则表达式将在*该行之前的行*中。 –

+0

感谢您的详细解释。 :) –

2

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

此外,你应该打印Found只有当事情真的找到。您可以修复,通过

print "Found: $found\n" if defined $found; 
+0

优秀点:) –

0

Double forward slash//)也可以用来初始化$found。这与unless非常相似。唯一要做的就是修改print行,如下所示。如果$found未初始化,将会打印“Nothing”。

结果(Perl的v5.10.1):

Found: Nothing 
Found: Nothing