سؤال

لقد كان هذا يعمل بالنسبة لي في 5.8 و 5.10 ، ولكن في 5.12 ، يقوم الكود بإنشاء هذا الكائن الغريب غير QR:

# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );

في حين أن طباعة QR // لم يتم إنشاؤها بواسطة الكود الخاص بي تبدو هكذا:

# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;

الكود الخاص بي هو في الأساس:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = sv_2mortal(newSVpv("",0));

sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0);

stash = gv_stashpv("Regexp", 0);
sv_bless(newRV((SV*)regex), stash);

أي شخص يعرف كيفية إنشاء regex بشكل صحيح من سلسلة في 5.12؟

هل كانت مفيدة؟

المحلول

شكرا لوضعني على المسار الصحيح ، يا شباب ، اتضح أنني كنت على محمل الجد التفكير في هذا. لقد قطعوا الخط السحري ولا يخلقون الكهروضوئية.

هذا كل ما عليك القيام به في بيرل 5.12:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);

نصائح أخرى

ألق نظرة على التعليقات في هذه الجواب من هوبز. لقد قمت بنسخه أدناه لسهولة القراءة:

تحصل كائنات Regex فعليًا على "جوهر" أكثر بقليل في 5.12.0 ، حيث إنها الآن تشير إلى عدد سكان نوع regexp بدلاً من الإشارات إلى القياس مع السحر. ومع ذلك ، هذا غير مرئي تمامًا لرمز المستخدم ، إلا إذا تمكنت من تجاوز عملية التحميل الزائد ، في هذه الحالة ، ستلاحظ أن regexes تُطبع الآن على أنها regexp = regexp (0x1234567) بدلاً من regexp = calar (0x1234567)

لست على دراية بشكل خاص بـ XS ، لكنني أظن أنه لا يمكنك استخدام قيمة العددية بعد الآن لإنشاء Regex.

Perl 5.12 غيرت regexps ليكون كائنات الدرجة الأولى, التي تجدها كجزء من المناقشة العرضية في كيف أتحقق مما إذا كان العددي يحتوي على إعادة تجميعه؟.

أنا لست شخصًا XS ، لذلك لا أعرف ما تحتاج إلى تغييره في الكود لجعله ينجح. يوضح البحث عن "regexp" في مصادر Perl الإصلاحات التي قاموا بها إلى الوحدات الأساسية لاستخدام الأشياء الجديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top