tags:

views:

71

answers:

3

I have the following code.

Here I am matching the vowels characters words:

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

I am trying to get the all matched patterns using grouping, but I am getting only the last expression pattern, which means the fifth expression of the if condition. Here I know that it is giving only one pattern because last pattern matching in if condition. I want to get all matched patterns, however. Can anyone help me out of this problem?

+2  A: 
  • You have 5 patterns with one matching group () each. Not 1 pattern with 5 groups.
  • (a)+ looks for a string containing a, aa, aaa, aaaa etc.
    The match will be multiple a's, not the word containing the group of a-s.
  • Your if( ...) is true if $_ contains one or more of 'a','e','i','o','u'.
lexu
+3  A: 

It is not quite clear what you want to do. Here are some thoughts.

Are you trying to count the number of vowels? In which case, tr will do the job:

    my $count = tr/aeiou// ;
    printf("string:%-20s count:%d\n" , $_ , $count ) ;

output :

    string:book                 count:2
    string:stackoverflow        count:4

Or extract the vowels

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

Output from "stackoverflow question"

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

Or extract sequences of vowels

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

Output from "stackoverflow question"

    $VAR1 = [
              'a',
              'o',
              'e',
              'o',
              'ue',
              'io'
            ];
justintime
+3  A: 

You could use

sub match_all {
  my($s,@patterns) = @_;

  my @matches = grep @$_ >= 1,
                map [$s =~ /$_/g] => @patterns;

  wantarray ? @matches : \@matches;
}

to create an array of non-empty matches.

For example:

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";
}

Output:

[aaa][aa]
[e]
[iiii]
[oo]
[uuuuu]

An input of, say, "aaa iiii oo uuuuu aa" produces

4 matches
Greg Bacon