如何测试Perl regexp匹配中是否定义了捕获?

时间:2012-01-18 23:15:38

标签: perl

如何测试是否在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不匹配,则不应打印。

3 个答案:

答案 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";