Perl: как получить все сгруппированные шаблоны - PullRequest
1 голос
/ 01 апреля 2010

У меня есть следующий код.

Здесь я сопоставляю гласных символов слов :

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

Я пытаюсь получить все сопоставленные шаблоны, используя группировку, но я получаю только последний шаблон выражения, что означает пятое выражение условия if. Здесь я знаю, что он дает только один шаблон , потому что последний шаблон соответствует в if условии . Однако я хочу получить все подходящие шаблоны. Может кто-нибудь помочь мне выйти из этой проблемы?

Ответы [ 3 ]

3 голосов
/ 01 апреля 2010

Не совсем понятно, что вы хотите сделать. Вот несколько мыслей.

Вы пытаетесь посчитать количество гласных? В этом случае 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 question"

    $VAR1 = [
              'a',
              'o',
              'e',
              'o',
              'u',
              'e',
              'i',
              'o'
            ];

Или извлекать последовательности гласных

    my @array = / ( [aeiou]+ ) /xg  ;
    print Dumper \@array ;

Вывод из "stackoverflow question"

    $VAR1 = [
              'a',
              'o',
              'e',
              'o',
              'ue',
              'io'
            ];
3 голосов
/ 01 апреля 2010

Вы можете использовать

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 голосов
/ 01 апреля 2010
  • У вас есть 5 паттернов с одной подходящей группой () каждый. Не 1 шаблон с 5 группами.
  • (a) + ищет строку, содержащую a, aa, aaa, aaaa и т. Д.
    Соответствие будет кратным a, а не словом, содержащим группу a-s.
  • Ваше if (...) истинно, если $ _ содержит один или несколько из 'a', 'e', ​​'i', 'o', 'u'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...