Perl regex vs Raku regex, perbedaan dalam mesin?

9

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, saysemua 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>/;
Holli
sumber
1
FYI, pertanyaan raku diperbolehkan di PerlMonks
ikegami

Jawaban:

1

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.

my $lex-var;

sub debug { .say for ++$, :$<rex-var>, :$lex-var }

my $regex = / $<rex-var> = (.) { $lex-var = $<rex-var> } <?before . { debug }> / ;

'xx' ~~   $regex;     say $/;
'xx' ~~ / $regex /;   say $/;

menampilkan:

1
rex-var => Nil
lex-var => x
x
 rex-var => x
2
rex-var => Nil
lex-var => x
x

Fokus pertama pada panggilan pertama debug(garis dimulai dengan 1dan berakhir pada rex-var => 「x」), kita dapat melihat bahwa:

  • Ada yang salah selama panggilan ke debug: $<rex-var>dilaporkan memiliki nilai Nil.

  • Ketika pencocokan regex selesai dan kami kembali ke garis utama, say $/melaporkan hasil lengkap dan benar yang mencakup rex-varpencocokan 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 sebagai Nilselama debugpanggilan, variabel pertandingan akhir, seperti yang dilaporkan kembali di jalur utama dengan yang kedua say $/, juga tidak ada rex-varpertandingan. Dan satu-satunya perbedaan adalah bahwa regex $regexdipanggil dari dalam regex luar.

raiph
sumber