我有以下代码。
这里我匹配元音字符:
if ( /(a)+/ and /(e)+/ and /(i)+/ and /(o)+/ and /(u)+/ )
{
print "$1#$2#$3#$4#$5\n";
$number++;
}
我试图使用分组来获取所有匹配的模式,但我只获得最后一个表达模式,这意味着if
条件的第五个表达式。在这里,我知道它只提供一个模式,因为if
条件中的最后一个模式匹配。但是,我希望获得所有匹配的模式。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:3)
目前还不清楚自己想做什么。这是一些想法。
你想算出元音的数量吗?在这种情况下,tr将完成这项工作:
my $count = tr/aeiou// ;
printf("string:%-20s count:%d\n" , $_ , $count ) ;
输出:
string:book count:2
string:stackoverflow count:4
或提取元音
my @array = / ( [aeiou] ) /xg ;
print Dumper \@array ;
“stackoverflow问题”的输出
$VAR1 = [
'a',
'o',
'e',
'o',
'u',
'e',
'i',
'o'
];
或提取元音序列
my @array = / ( [aeiou]+ ) /xg ;
print Dumper \@array ;
“stackoverflow问题”的输出
$VAR1 = [
'a',
'o',
'e',
'o',
'ue',
'io'
];
答案 1 :(得分:3)
您可以使用
sub match_all {
my($s,@patterns) = @_;
my @matches = grep @$_ >= 1,
map [$s =~ /$_/g] => @patterns;
wantarray ? @matches : \@matches;
}
创建一个非空匹配数组。
例如:
my $string = "aaa e iiii oo uuuuu aa";
my @matches = match_all $string, map qr/$_+/ => qw/ a e i o u /;
if (@matches == 5) {
print "[", join("][", @$_), "]\n"
for @matches;
}
else {
my $es = @matches == 1 ? "" : "es";
print scalar(@matches), " match$es\n";
}
输出:
[aaa][aa] [e] [iiii] [oo] [uuuuu]
例如"aaa iiii oo uuuuu aa"
的输入产生
4 matches
答案 2 :(得分:2)