Tutorial :Perl: How to get all grouped patterns



Question:

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?


Solution:1

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'              ];  


Solution:2

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


Solution:3

  • 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'.

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »