পার্ল রেজেক্স বনাম রাকু রেজেেক্স, ইঞ্জিনের মধ্যে পার্থক্য?


9

আমি পার্ল থেকে রাকুতে ন্যাপস্যাক সমস্যার জন্য একটি রেজেক্স ভিত্তিক সমাধানকে রূপান্তর করার চেষ্টা করছি। পার্লমনস্কে বিশদ

পার্ল দ্রবণটি এই রেজেক্স তৈরি করে:

(?<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ডিবাগগুলি সকলে নীল বলে, তাই এই মুহুর্তে পিছনের দিকটি কাজ করে না?

এখানে আমার পরীক্ষার স্ক্রিপ্ট:

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
এফওয়াইআই, রাকু প্রশ্নগুলি পার্লমঙ্কস
আইকেগামি

উত্তর:


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নাম প্রকাশিত ম্যাচ অন্তর্ভুক্ত includes

কী ভুল হয়েছে তা অনুধাবন করার জন্য, দয়া করে অন্য একটি এসও প্রশ্নের উত্তর আমার বেশিরভাগ অংশে পড়া বিবেচনা করুন । আপনি নিরাপদে ব্যবহার~ বাদ দিতে পারেন । ১,২ এবং Foot পাদটীকা সম্ভবত আপনার দৃশ্যের সাথে সম্পূর্ণ অপ্রাসঙ্গিক।

দ্বিতীয় ম্যাচের জন্য, আমরা দেখতে পাচ্ছি যে শুধুমাত্র কল চলাকালীন ছিল বলে $<rex-var>জানা যায়নি , চূড়ান্ত ম্যাচ ভেরিয়েবল, যেমনটি দ্বিতীয়টির সাথে মেইনলাইনে ফিরে আসে , এছাড়াও ম্যাচটি মিস করে । এবং পার্থক্যটি হ'ল বাইরের রেজেক্সের মধ্যে থেকেই রেজেক্সকে ডাকা হয় ।Nildebugsay $/rex-var$regex

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.