考虑以下规则
<rule: str>
( <[token1]> | <[token2]> ) +
输出(%/
)对于以下输入
input1: <token1> <token2> <token1>
input2: <token1> <token1> <token2>
这是因为第二个被附加到名为'token1'的列表中的第一个,但是没有关于匹配其他令牌的顺序的提示。
知道如何将匹配订单保存到%/
?
P.S。我在使用这个%/ magical变量编译脚本时遇到问题。使用%/
后,它总是在行上出错。我假设编译器认为它是正则表达式的开头而没有终止/ ...如果我正确使用它,请告诉我。
答案 0 :(得分:1)
您可以将<str>
转换为<[str]>
,这样就可以在$/->{str}
中找到像这样的数组
#!/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>"
]
};
#>>>>#