如何使用Perl查找和打印与正则表达式匹配的所有字符串?
以下仅查找第一场比赛.
$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";
if($text =~ m/\\?([^\.]+\.)/) {
print "$1\n";
}
Run Code Online (Sandbox Code Playgroud)
/g不起作用#!/usr/bin/env perl
$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";
if($text =~ m/\\?([^\.]+\.)/g) {
print "$1\n";
}
$ ./test.pl
?Adsfsadfgaasdf.
Run Code Online (Sandbox Code Playgroud)
问题是/g修饰符不会将捕获组用于多个匹配.您需要在标量上下文中迭代匹配,或者在列表上下文中捕获返回的列表.例如:
use v5.10; # required for say()
$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";
while ($text =~ /\?([^.]+\.)/g) { # scalar context
say $1;
}
for ($text =~ /\?[^.]+\./g) { # list context
say; # match is held in $_
}
Run Code Online (Sandbox Code Playgroud)
注意在第二种情况下,我跳过了parens,因为在列表上下文中,如果没有parens则返回整个匹配.您可以添加parens来选择字符串的一部分.
您的版本if使用标量上下文,它保存最近匹配的位置,但不会继续.看看会发生什么的方法是:
if($text =~ m/\?([^\.]+\.)/g) {
print "$1\n";
}
say "Rest of string: ", substr $text, pos;
Run Code Online (Sandbox Code Playgroud)
pos 给出了最近一场比赛的位置.