我无法弄清楚为什么正则表达式模式不匹配.此外,输出抱怨$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";
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
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:
Run Code Online (Sandbox Code Playgroud)
我需要以$found其他方式初始化吗?另外,我是否正确创建了一个多行字符串来解释为正则表达式?
非常感谢.
Hun*_*len 17
如果模式match(=~)与任何内容都不匹配,则标量中不会存储任何内容,$found因此Perl会抱怨您正在尝试插入未赋值的变量.
除非有条件,否则您可以使用postfix轻松解决此问题:
$found = "Nothing" unless $found
print "Found: $found\n";
Run Code Online (Sandbox Code Playgroud)
$found 只有在没有值的情况下,上面的代码才会赋值"Nothing" .现在,无论是哪种情况,您的print语句都将始终正常工作.
你也可以使用一个简单的if语句,但这似乎更冗长:
if( $found ) {
print "Found: $found\n";
}
else {
print "Not found\n";
}
Run Code Online (Sandbox Code Playgroud)
另一个可能最干净的选项是将模式匹配放在if语句中:
if( my ($found) = $item =~ m/($regex_patterns)/i ) {
# if here, you know for sure that there was a match
print "Found: $found\n";
}
Run Code Online (Sandbox Code Playgroud)