如何测试是否在Perl regexp匹配中定义了捕获?
#!/usr/bin/env perl
use v5.10;
my $str="foobar
barfoo";
while($str =~ m/(?:(f.*))|(?:(b.*))/g) {
say "+ $1";
say "- $2";
}
输出
+ foobar
-
+
- barfoo
而我想要的是
+ foobar
- barfoo
即。如果$1
或$2
不匹配,则不应打印。
答案 0 :(得分:4)
问题是你没有测试它是否被定义,所以它将打印+/-两种方式。
while($str =~ m/(?:(f.*))|(?:(b.*))/g) {
say "+ $1" if defined($1);
say "- $2" if defined($2);
}
答案 1 :(得分:2)
使用defined(...)
功能。如果未定义$1
,则defined($1)
将返回false。
答案 2 :(得分:1)
最好不要依赖设置$1
和朋友的副作用。正如您所证明的那样,它是一系列错误的原因,应该避免。相反,只需使用匹配运算符的返回值。
while(my ($plus, $minus) = $str =~ m/(?:(f.*))|(?:(b.*))/g) {
say "+ $plus";
say "- $minus";