2010-04-21 11 views
14

यह 5.8 और 5.10 में मेरे लिए काम कर रहा है, लेकिन 5.12 में मेरे कोड इस अजीब गैर qr ऑब्जेक्ट बनाएगी:सी से पर्ल 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 में एक स्ट्रिंग से एक regex बनाने के लिए?

उत्तर

11

मुझे सही रास्ते पर रखने के लिए धन्यवाद, दोस्तों, यह पता चला कि मैं गंभीरता से इस पर विचार कर रहा था। वे सिर्फ जादू लाइन काटते हैं और पीवी नहीं बनाते हैं।

यह सब आप पर्ल 5.12 में क्या करने की जरूरत है:

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

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

सुनिश्चित करें कि आप अपने जवाब :) –

+1

मुझे यह पसंद है जब आप जादू से छुटकारा पा सकते स्वीकार करें। :) –

+0

मुझे भी! यह नए तरीके से बहुत अधिक समझ में आता है। – kristina

6

this में टिप्पणियों पर एक नज़र डालें। मैं इसे पढ़ने में आसानी के लिए नीचे कॉपी किया है:

Regex वस्तुओं वास्तव में थोड़ा अधिक "मूल" 5.12.0 में मिलता है, के रूप में वे अब जादू के साथ scalars के लिए संदर्भ के बजाय प्रकार regexp की scalars के लिए संदर्भ कर रहे हैं। जब तक आप अतिभारित stringification, जिस स्थिति में आप देखेंगे कि regexes अब Regexp = regexp (0x1234567) के रूप में मुद्रित बायपास करने के लिए प्रबंधन लेकिन यह पूरी तरह से उपयोगकर्ता कोड के लिए अदृश्य है, के बजाय Regexp के = SCALAR (0x1234567)

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

5

Perl 5.12 changed regexps to be first class objects, जो आपको How do I check if a scalar has a compiled regex it in? में स्पर्शिक चर्चा के हिस्से के रूप में मिलता है।

मैं एक एक्सएस व्यक्ति नहीं हूं, इसलिए मुझे नहीं पता कि इसे आपके कोड में बदलने के लिए आपको क्या करना है। पर्ल स्रोतों में 'REGEXP' के लिए खोज करना नई सामग्री का उपयोग करने के लिए कोर मॉड्यूल में किए गए फ़िक्स दिखाता है।