regex - मैं सी से पर्ल 5.12 में एक qr// कैसे बना सकता हूं?




perl xs (2)

यह मेरे लिए 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);

किसी को भी पता है कि 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 = SCALAR (0x1234567)

मैं विशेष रूप से एक्सएस से परिचित नहीं हूं, लेकिन मुझे संदेह है कि आप अपने रैगेक्स को बनाने के लिए किसी स्केलर मान का उपयोग नहीं कर सकते।







qr-operator