我怎样才能存储正则expression式捕获在Perl中的数组?

我试图在Perl中使用正则expression式。 我奇怪的是,如果有可能将expression式的所有匹配存储到数组中? 我知道我可以使用以下内容: ($1,...,$n) = m/expr/g; 但似乎只有当你知道你正在寻找的比赛数量时才能使用。 我试过my @array = m/expr/g; 但似乎并不奏效。

谢谢你的帮助!

如果您正在进行全局匹配( /g ),则列表上下文中的正则expression式将返回所有捕获的匹配。 简单地做:

 my @matches = ( $str =~ /pa(tt)ern/g ) 

这个命令例如:

 perl -le '@m = ( "foo12gfd2bgbg654" =~ /(\d+)/g ); print for @m' 

给出输出:

 12 2 654 

有时你需要全局匹配,比如PHP的preg_match_all 。 如果是你的情况,那么你可以写下如下的东西:

 # a dummy example my $subject = 'Philip Fry Bender Rodriguez Turanga Leela'; my @matches; push @matches, [$1, $2] while $subject =~ /(\w+) (\w+)/g; use Data::Dumper; print Dumper(\@matches); 

它打印

 $VAR1 = [ [ 'Philip', 'Fry' ], [ 'Bender', 'Rodriguez' ], [ 'Turanga', 'Leela' ] ]; 

在“在列表上下文中匹配”下查看perldoc perlop的手动条目:

如果没有使用/ g选项,m //在列表上下文中返回一个由expression式组成的列表,这个子expression式由模式中的括号匹配,即($ 1,$ 2,$ 3 …)

/ g修饰符指定全局模式匹配 – 即在string内尽可能多次匹配。 它的performance取决于上下文。 在列表上下文中,它将返回正则expression式中任何捕获括号所匹配的子string列表。 如果没有括号,则返回所有匹配的string的列表,就好像在整个模式中有括号一样。

您可以简单地通过分配数组来获取所有的匹配项,或者在列表上下文中执行评估:

 my @matches = ($string =~ m/word/g); 

我认为这是一个不言自明的例子。 注意/g第一个正则expression式中的修饰符:

 $string = "one two three four"; @res = $string =~ m/(\w+)/g; print Dumper(@res); # @res = ("one", "two", "three", "four") @res = $string =~ m/(\w+) (\w+)/; print Dumper(@res); # @res = ("one", "two") 

请记住,您需要确保左值在列表上下文中,这意味着您必须用括号括起标量值:

 ($one, $two) = $string =~ m/(\w+) (\w+)/;