2017-03-17 72 views
0

我在正则表达式中创建了两个命名的捕获变量,第二个似乎没有返回任何值,而第一个可以。我不知道为什么......这里是代码。Perl命名捕获组

my $string = 'test [google] another test [windows]'; 

my $regex=qr/\w*\[{1}(?<firstBracket>\w+)\]{1}(?<secondBracket>\w*)/ip; 

$string=~ /$regex/; 

say $+{secondBracket}; 

我期待“secondBracket”将会返回。 我可以做$+{firstBracket},但不是第二个...有人可以帮忙吗?

谢谢。

+4

空间不是在你的模式描述。量词{1}无用,请删除它们。 –

+5

不要在void上下文中使用'm //'。在使用任何捕获变量之前,总是检查匹配是否成功。 – melpomene

回答

3

你大概的意思是:

my $string = 'test [google] another test [windows]'; 

if($string =~ /.*?\[(?<firstBracket>\w+)\].*?\[(?<secondBracket>\w+)\]/i) { 
     say $+{firstBracket}; 
     say $+{secondBracket}; 
} 

输出

google 
windows 

my $re = qr/.*?\[(?<firstBracket>\w+)\].*?\[(?<secondBracket>\w+)\]/i; 
if($string =~ $re) { 
    ... 
} 

具有相同的输出...

+0

谢谢......我也意识到,我没有包括第一支架和第二支架之间的空间!愚蠢 –