Perl:如何获取所有分组模式

时间:2010-04-01 09:32:42

标签: perl

我有以下代码。

这里我匹配元音字符

if ( /(a)+/ and /(e)+/ and /(i)+/ and /(o)+/ and /(u)+/ )
{
print "$1#$2#$3#$4#$5\n";
$number++;
}

我试图使用分组来获取所有匹配的模式,但我只获得最后一个表达模式,这意味着if条件的第五个表达式。在这里,我知道它只提供一个模式,因为if条件中的最后一个模式匹配。但是,我希望获得所有匹配的模式。任何人都可以帮我解决这个问题吗?

3 个答案:

答案 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)

  • 您有5个模式,每个模式有一个匹配的组()。不是1组,有5组。
  • (a)+查找包含a,aa,aaa,aaaa等的字符串。
    匹配将是多个a,而不是包含a-s组的单词。
  • 如果$ _包含'a','e','i','o','u'中的一个或多个,则if(...)为真。