2011-03-31 102 views
0

考慮以下規則如何以%/?保存匹配順序

<rule: str> 
    (<[token1]> | <[token2]>) + 

輸出(%/)將是相同的以下輸入

input1: <token1> <token2> <token1> 
input2: <token1> <token1> <token2> 

這是因爲,第二被附加到一個列表中的第一個命名爲「TOKEN1 '但沒有關於其他令牌匹配順序的暗示。

任何想法如何將匹配順序保存到%/

p.s.我用這個%/魔術變量編譯腳本時遇到問題。在使用%/後,它總是給我一個錯誤。我認爲編譯器認爲它是一個正則表達式的開始而不終止/ ...請讓我知道,如果我正確使用它。

回答

1

您在$/->{str}與陣列轉向<str><[str]>所以你endup這樣

#!/usr/bin/perl -- 
use strict; use warnings; 
my $jp = do { 
    use Regexp::Grammars; 
qr{ 
# Keep the big stick handy, just in case... 
    <debug:on> 
    <debug:step> 

<nocontext: > # Switch on context substring retention 

# Match this... 
<[str]>+ 

<rule: str> 
    (<MATCH=token1> | <MATCH=token2>) + 

<rule: token1> \<token1\> 
<rule: token2> \<token2\> 


}ixs}; 

for my $str( 
    q{input1: <token1> <token2> <token1>}, 
    q{input2: <token1> <token1> <token2>}, 
) { 
    print "#<<<<# $str \n\n"; 
    if($str =~ $jp){ 
     dd(\%/) ; #/ 
    } else { 
     print "## fail to match \n"; 
    } 
    print "\n#>>>>#\n\n"; 
} 

sub dd { 
    use Data::Dumper; 
    print Data::Dumper->new([@_])->Useqq(1)->Indent(1)->Dump, "\n"; 
} 
__END__ 
#<<<<# input1: <token1> <token2> <token1> 

$VAR1 = { 
    "str" => [ 
    "<token1>", 
    "<token2>", 
    "<token1>" 
    ] 
}; 


#>>>># 

#<<<<# input2: <token1> <token1> <token2> 

$VAR1 = { 
    "str" => [ 
    "<token1>", 
    "<token1>", 
    "<token2>" 
    ] 
}; 


#>>>>#