Perl 정규식 대 Raku 정규식, 엔진의 차이점은 무엇입니까?


9

배낭 문제에 대한 정규식 기반 솔루션을 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|)
)

에 대해 일치 vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww합니다. 그 후 매치 해시 %+는 자루에 넣을 아이템을 포함합니다.

내 라쿠 변환은 다음과 같습니다

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

또한 일치 vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww합니다. 그러나 일치 객체 $/에는 유용한 것이 포함되어 있지 않습니다. 또한 내 디버그는 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>/;

1
참고로, ral 질문은 PerlMonks
ikegami

답변:


1

이 답변은 무엇이 잘못되었는지에 대해서만 다룹니다. 솔루션을 다루지 않습니다. 해당 버그를 제출하지 않았습니다. 내가 직면 한 두 가지 문제 중 하나 또는 둘 다에 해당하는 보고서를 찾을 수 있는지 확인하기 위해 아직 버그 대기열을 검색하지 않았습니다.

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

표시합니다 :

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

의 첫 번째 호출 debug(로 시작 1하고 끝나는 라인)에 먼저 초점을 맞추면 다음을 rex-var => 「x」알 수 있습니다.

  • 를 호출하는 동안 문제 가 발생했습니다 debug: $<rex-var>값이있는 것으로보고되었습니다 Nil.

  • 정규식 일치가 완료되고 메인 라인으로 돌아 오면 이름 지정된 일치 say $/를 포함하여 올바르게 채워진 전체 결과 rex-var가보고됩니다.

무엇이 잘못되었는지 알기 시작하려면 다른 SO 질문에 대한 답변을 많이 읽어보십시오 . Using를~ 안전하게 건너 뛸 수 있습니다 . 각주 1, 2 및 6도 시나리오와 전혀 관련이 없습니다.

두 번째 일치의 경우 호출 중에있는 $<rex-var>것으로보고 될 뿐만 아니라 두 번째로 메인 라인에 다시보고 된 최종 일치 변수 도 일치하지 않습니다. 그리고 유일한 차이점은 정규식 이 외부 정규식 에서 호출 된다는 것 입니다.Nildebugsay $/rex-var$regex

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.