2012-03-13 59 views
7

我在匹配模式時遇到了一個奇怪的問題。使用數組時匹配Perl模式

考慮下面

#!/usr/bin/perl -w 

use strict; 
my @Array = ("Hello|World","Good|Day"); 

function(); 
function(); 
function(); 

sub function 
{ 
    foreach my $pattern (@Array) 
    { 
    $pattern =~ /(\w+)\|(\w+)/g; 
    print $1."\n"; 
    } 
    print "\n"; 
} 

__END__ 

Perl代碼我期望的輸出應該


 
Hello 
Good 

Hello 
Good 

Hello 
Good 

但我得到的是

 
Hello 
Good 

Use of uninitialized value $1 in concatenation (.) or string at D:\perlfiles\problem.pl li 
ne 28. 
Use of uninitialized value $1 in concatenation (.) or string at D:\perlfiles\problem.pl li 
ne 28. 

Hello 
Good 

我觀察到的是該模式交替。
有人可以解釋我這個代碼有什麼問題。
爲了解決這個問題,我改變了功能子程序是這樣的:

sub function 
{ 
    my $string; 
    foreach my $pattern (@Array) 
    { 
     $string .= $pattern."\n"; 
    } 
    while ($string =~ m/(\w+)\|(\w+)/g) 
    { 
      print $1."\n"; 
    } 
    print "\n"; 
} 

現在我得到的輸出如預期。

回答

6

這是在工作的全球/g修飾符。它記得最後一次模式匹配的位置。當它到達字符串的末尾時,它重新開始。

刪除/g修飾符,它將按照您的預期行事。

+0

我刪除了/ g修飾符。它按預期工作。 – vels 2012-03-13 04:54:23