Saya mencoba untuk mengubah solusi berbasis regex untuk masalah ransel dari Perl ke raku. Detail tentang Perlmonks
Solusi Perl menciptakan regex ini:
(?<P>(?:vvvvvvvvvv)?)
(?<B>(?:vv)?)
(?<Y>(?:vvvv)?)
(?<G>(?:vv)?)
(?<R>(?:v)?)
0
(?=
(?(?{ $1 })wwww|)
(?(?{ $2 })w|)
(?(?{ $3 })wwwwwwwwwwww|)
(?(?{ $4 })ww|)
(?(?{ $5 })w|)
)
yang akan dicocokkan vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww
. Setelah itu hash pertandingan %+
berisi item untuk dimasukkan ke dalam karung.
Konversi raku saya adalah:
$<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 || { "" } ]
yang juga cocok vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww
. Namun objek yang cocok, $/
tidak mengandung sesuatu yang berguna. Juga, say
semua debug saya mengatakan Nil, jadi pada saat itu sepertinya referensi tidak berfungsi?
Inilah skrip pengujian saya:
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>/;
Jawaban:
Jawaban ini hanya mencakup apa yang salah. Itu tidak membahas solusi. Saya belum mengajukan bug yang sesuai. Saya bahkan belum mencari antrian bug untuk melihat apakah saya dapat menemukan laporan yang sesuai dengan salah satu atau kedua masalah yang saya temukan.
menampilkan:
Fokus pertama pada panggilan pertama
debug
(garis dimulai dengan1
dan berakhir padarex-var => 「x」
), kita dapat melihat bahwa:Ada yang salah selama panggilan ke
debug
:$<rex-var>
dilaporkan memiliki nilaiNil
.Ketika pencocokan regex selesai dan kami kembali ke garis utama,
say $/
melaporkan hasil lengkap dan benar yang mencakuprex-var
pencocokan bernama.Untuk mulai memahami apa yang salah, harap pertimbangkan untuk membaca sebagian besar jawaban saya untuk pertanyaan SO lainnya . Anda dapat melewati Penggunaan
~
dengan aman . Catatan kaki 1,2, dan 6 mungkin juga sama sekali tidak relevan dengan skenario Anda.Untuk pertandingan kedua, kami melihat bahwa tidak hanya
$<rex-var>
dilaporkan sebagaiNil
selamadebug
panggilan, variabel pertandingan akhir, seperti yang dilaporkan kembali di jalur utama dengan yang keduasay $/
, juga tidak adarex-var
pertandingan. Dan satu-satunya perbedaan adalah bahwa regex$regex
dipanggil dari dalam regex luar.sumber