Estou tentando converter uma solução baseada em regex para o problema da mochila do Perl para o raku. Detalhes sobre Perlmonks
A solução Perl cria este regex:
(?<P>(?:vvvvvvvvvv)?)
(?<B>(?:vv)?)
(?<Y>(?:vvvv)?)
(?<G>(?:vv)?)
(?<R>(?:v)?)
0
(?=
(?(?{ $1 })wwww|)
(?(?{ $2 })w|)
(?(?{ $3 })wwwwwwwwwwww|)
(?(?{ $4 })ww|)
(?(?{ $5 })w|)
)
que é comparado com vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww
. Depois disso, o hash da partida %+
contém os itens a serem colocados no saco.
Minha conversão de 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 || { "" } ]
que também corresponde vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww
. Mas o objeto de correspondência $/
não contém nada de útil. Além disso, todos os meus erros de depuração say
dizem Nil; portanto, nesse ponto, a referência anterior parece não funcionar?
Aqui está o meu script de teste:
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>/;
Respostas:
Esta resposta cobre apenas o que está errado. Não trata de uma solução. Eu não arquivei os erros correspondentes. Ainda não procurei filas de bugs para ver se consigo encontrar relatórios correspondentes a um ou ambos os dois problemas que surgiram.
exibe:
Focando primeiro na primeira chamada de
debug
(as linhas começando1
e terminando emrex-var => 「x」
), podemos ver que:Algo deu errado durante a chamada para
debug
:$<rex-var>
é relatado como tendo o valorNil
.Quando a correspondência de regex estiver concluída e retornarmos à linha principal, o
say $/
relatório informará um resultado completo e preenchido corretamente que inclui arex-var
correspondência nomeada.Para começar a entender o que deu errado, considere ler a maior parte da minha resposta para outra pergunta do SO . Você pode pular com segurança o Usando
~
. As notas de rodapé 1,2 e 6 também são provavelmente completamente irrelevantes para o seu cenário.Para a segunda correspondência, vemos que não apenas é
$<rex-var>
relatada como sendoNil
durante adebug
chamada, a variável de correspondência final, conforme relatada na linha principal com a segundasay $/
, também está perdendo arex-var
correspondência. E a única diferença é que o regex$regex
é chamado de dentro de um regex externo.fonte