2012-03-13 146 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