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ます。しかし、matchオブジェクトに$/は、有用なものは何も含まれていません。また、私のデバッグは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
参考までに、PerlMonksでは楽の質問が許可されます
池上

回答:


1

この回答は、何が問題なのかをカバーしています。解決策は扱いません。対応するバグを提出していません。私が見つけた2つの問題のいずれかまたは両方に対応するレポートを見つけることができるかどうかを確認するために、まだバグキューを検索していません。

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質問に対する私の回答の大部分を読むことを検討してください。使用を~安全にスキップできます。脚注1、2、および6も、おそらくシナリオとはまったく無関係です。

2番目の一致については、通話中$<rex-var>として報告されているだけでなく、2番目のでメインラインに報告された最終一致変数にも一致がないことがわかります。唯一の違いは、正規表現が外部の正規表現から呼び出されることです。Nildebugsay $/rex-var$regex

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.