Как сохранить соответствующий порядок в% /? - PullRequest
0 голосов
/ 31 марта 2011

Рассмотрим следующее правило

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

выход (%/) будет одинаковым для следующих входов

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

Это связано с тем, что 2nd добавляется к первому в списке с именем 'token1', но нет никаких указаний на порядок сопоставления с другими токенами.

Есть идеи, как сохранить соответствующий порядок в %/?

p.s. У меня проблемы с компиляцией моих скриптов с этой переменной% / magical. Это всегда дает мне ошибку в строке после использования %/. Я предполагаю, что компилятор рассматривает его как начало регулярного выражения без завершения / ... Пожалуйста, дайте мне знать, если я правильно его использую.

1 Ответ

1 голос
/ 03 марта 2012

Вы делаете это, превращая <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>"
  ]
};


#>>>>#
...