我怎样才能存储正则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+)/;