代码之家  ›  专栏  ›  技术社区  ›  Pavunkumar

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

  •  1
  • Pavunkumar  · 技术社区  · 15 年前

    我有以下代码。

    在这里我匹配 元音字符单词 :

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

    我试图使用分组来获得所有匹配的模式,但我只得到最后一个表达式模式,这意味着 if 条件。我知道这里只有一种模式 因为最后一个模式匹配 如果 条件 . 不过,我想得到所有匹配的模式。有人能帮我解决这个问题吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   justintime    15 年前

    你想做什么还不太清楚。这里有一些想法。

    你想数一数元音的数目吗?在这种情况下, 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'
                ];
    
        2
  •  3
  •   Greg Bacon    15 年前

    你可以用

    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
        3
  •  2
  •   lexu    15 年前
    • 您有5个模式,每个模式有一个匹配的组()。不是一个模式五组。
    • (a)+查找包含a、aa、aaa、aaaa等的字符串。
      匹配将是多个a,而不是包含a-s组的单词。
    • 如果$包含一个或多个“a”、“e”、“i”、“o”、“u”,则if(…)为真。