Perl regex与Raku regex,引擎的差异?

Hol*_*lli 6 regex raku

我正在尝试将针对背包问题的基于正则表达式的解决方案从Perl转换为raku。Perlmonks的详细资料

Perl解决方案创建此正则表达式:

(?<P>(?:vvvvvvvvvv)?)
(?<B>(?:vv)?)
(?<Y>(?:vvvv)?)
(?<G>(?:vv)?)
(?<R>(?:v)?)
0
(?=
(?(?{ $1 })wwww|)
(?(?{ $2 })w|)
(?(?{ $3 })wwwwwwwwwwww|)
(?(?{ $4 })ww|)
(?(?{ $5 })w|)
)
Run Code Online (Sandbox Code Playgroud)

与匹配vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww。之后,匹配哈希%+包含要放入麻袋中的物品。

我的raku转换是:

$<B> = [ [ vv ]? ]
$<P> = [ [ vvvvvvvvvv ]? ]
$<R> = [ [ v ]? ]
$<Y> = [ [ vvvv ]? ]
$<G> = [ [ vv ]? ]
0
<?before
[ { say "B"; say $/<B>; say $0; say $1; $1 } w || { "" } ]
[ { say "P"; say $/<P>; say $0; say $1; $2 } wwww || { "" } ]
[ { say "R"; say $/<R>; say $0; say $1; $3 } w || { "" } ]
[ { say "Y"; say $/<Y>; say $0; say $1; $4 } wwwwwwwwwwww || { "" } ]
[ { say "G"; say $/<G>; say $0; say $1; $5 } ww || { "" } ]
Run Code Online (Sandbox Code Playgroud)

这也匹配vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww。但是match对象$/不包含任何有用的东西。另外,我的调试程序say都说Nil,所以在那个时候反向引用似乎不起作用?

这是我的测试脚本:

my $max-weight = 15;
my %items      =
    'R' => { w =>  1, v =>  1 },
    'B' => { w =>  1, v =>  2 },
    'G' => { w =>  2, v =>  2 },
    'Y' => { w => 12, v =>  4 },
    'P' => { w =>  4, v => 10 }
;

my $str = 'v' x  %items.map(*.value<v>).sum ~
          '0' ~
          'w' x  $max-weight;

say $str;

my $i = 0;
my $left = my $right = '';

for %items.keys -> $item-name
{
    my $v = 'v' x %items{ $item-name }<v>;
    my $w = 'w' x %items{ $item-name }<w>;

     $left  ~= sprintf( '$<%s> = [ [ %s ]? ] ' ~"\n", $item-name, $v );
     $right ~= sprintf( '[ { say "%s"; say $/<%s>; say $0; say $1; $%d } %s || { "" } ]' ~ "\n", $item-name, $item-name, ++$i, $w );
}
use MONKEY-SEE-NO-EVAL;

my $re = sprintf( '%s0' ~ "\n" ~ '<?before ' ~ "\n" ~ '%s>' ~ "\n", $left, $right );

say $re;
dd $/ if $str ~~ m:g/<$re>/;
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 1

这个答案仅涵盖了问题所在。它没有提出解决方案。我还没有提交相应的错误。我什至还没有搜索错误队列,看看是否可以找到与我遇到的两个问题中的一个或两个相对应的报告。

\n\n
my $lex-var;\n\nsub debug { .say for ++$, :$<rex-var>, :$lex-var }\n\nmy $regex = / $<rex-var> = (.) { $lex-var = $<rex-var> } <?before . { debug }> / ;\n\n\'xx\' ~~   $regex;     say $/;\n\'xx\' ~~ / $regex /;   say $/;\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示:

\n\n
1\nrex-var => Nil\nlex-var => \xef\xbd\xa2x\xef\xbd\xa3\n\xef\xbd\xa2x\xef\xbd\xa3\n rex-var => \xef\xbd\xa2x\xef\xbd\xa3\n2\nrex-var => Nil\nlex-var => \xef\xbd\xa2x\xef\xbd\xa3\n\xef\xbd\xa2x\xef\xbd\xa3\n
Run Code Online (Sandbox Code Playgroud)\n\n

首先关注第一次调用debug(以 开头1和结尾的行rex-var => \xef\xbd\xa2x\xef\xbd\xa3),我们可以看到:

\n\n
    \n
  • 在调用 : 期间出现问题debug$<rex-var>报告值为Nil

  • \n
  • 当正则表达式匹配完成并且我们返回主线时,将say $/报告完整且正确填充的结果,其中包括rex-var命名匹配。

  • \n
\n\n

要开始了解出了什么问题,请考虑阅读我对另一个 SO 问题的大部分回答。您可以安全地跳过使用~。脚注 1,2 和 6 也可能与您的场景完全无关。

\n\n

对于第二场比赛,我们看到不仅在调用期间$<rex-var>报告为存在,而且在主线中与第二场比赛一起报告的最终比赛变量也缺少匹配。唯一的区别是正则表达式是从外部正则表达式内部调用的。Nildebugsay $/rex-var$regex

\n