Perl regex so với Raku regex, sự khác biệt trong động cơ?


9

Tôi đang cố gắng chuyển đổi một giải pháp dựa trên regex cho vấn đề về chiếc ba lô từ Perl sang raku. Chi tiết về Perlmonks

Giải pháp Perl tạo regex này:

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

mà được kết hợp với vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww. Sau đó, hàm băm khớp %+chứa các vật phẩm cần bỏ vào bao tải.

Chuyển đổi raku của tôi là:

$<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 || { "" } ]

mà cũng phù hợp vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww. Nhưng đối tượng phù hợp, $/không chứa bất cứ điều gì hữu ích. Ngoài ra, saytất cả các gỡ lỗi của tôi đều nói Nil, vì vậy tại thời điểm đó, phản hồi có vẻ không hoạt động?

Đây là kịch bản thử nghiệm của tôi:

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>/;

1
FYI, câu hỏi raku được cho phép trên PerlMonks
ikegami

Câu trả lời:


1

Câu trả lời này chỉ bao gồm những gì sai. Nó không giải quyết một giải pháp. Tôi chưa nộp lỗi tương ứng. Tôi thậm chí chưa tìm kiếm hàng đợi lỗi để xem liệu tôi có thể tìm thấy các báo cáo tương ứng với một hoặc cả hai vấn đề tôi đã nổi lên không.

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 $/;

hiển thị:

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

Tập trung đầu tiên vào cuộc gọi đầu tiên của debug(các dòng bắt đầu bằng 1và kết thúc tại rex-var => 「x」), chúng ta có thể thấy rằng:

  • Một cái gì đó không ổn trong khi gọi đến debug: $<rex-var>được báo cáo là có giá trị Nil.

  • Khi trận đấu regex hoàn tất và chúng tôi trở lại tuyến chính, say $/ báo cáo kết quả được điền đầy đủ và chính xác bao gồm rex-vartrận đấu được đặt tên.

Để bắt đầu hiểu được những gì đã sai, vui lòng xem xét việc đọc phần lớn câu trả lời của tôi cho một câu hỏi SO khác . Bạn có thể bỏ qua việc sử dụng~ một cách an toàn . Chú thích 1,2 và 6 có lẽ hoàn toàn không liên quan đến kịch bản của bạn.

Đối với trận đấu thứ hai, chúng tôi thấy rằng không chỉ được $<rex-var>báo cáo là Niltrong suốt debugcuộc gọi, biến trận đấu cuối cùng, như được báo cáo lại trong dòng chính với lần thứ hai say $/, cũng bị thiếu rex-vartrận đấu. Và sự khác biệt duy nhất là regex $regexđược gọi từ bên trong một regex bên ngoài.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.