2010-04-01 21 views
1

我有以下代碼。Perl:如何獲取所有分組模式

在這裏,我匹配元音字符的話

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

我嘗試使用分組來獲取所有匹配的模式,但我只得到了最後的表達模式,這意味着第五表達if條件。在這裏,我知道它只給出一個模式,因爲在if條件的最後模式匹配。然而,我想獲得所有匹配的模式。任何人都可以幫我解決這個問題嗎?

+0

你的意思是字符串必須包含的所有5個,E ,I,O,U? – kennytm 2010-04-01 09:35:23

回答

3

這是不是很清楚你想要做什麼。這裏有一些想法。

你想要計算元音的數量嗎?在這種情況下,tr將做的工作:

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

輸出:

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

或者從 「計算器問題」

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

提取元音

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

輸出或提取序列小號元音從 「計算器問題」

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

輸出

$VAR1 = [ 
       'a', 
       'o', 
       'e', 
       'o', 
       'ue', 
       'io' 
      ]; 
2
  • 你有5個模式,每個模式有一個匹配組()。 5組不1模式。
  • (a)+查找包含a,aa,aaa,aaaa等的字符串。
    該匹配項是多個a,而不是包含a-s組的字。
  • 如果$ _包含'a','e','i','o','u'中的一個或多個,則您的if(...)爲真。
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