2010-04-21 13 views
14

Questo ha lavorato per me in 5.8 e 5.10, ma in 5.12 mio codice crea questo strano oggetto non qr:Come posso creare un qr // in Perl 5.12 da C?

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

Mentre la stampa di un qr // non creato da mio codice è simile al seguente:

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

Il mio codice è fondamentalmente:

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); 

Qualcuno sa come creare correttamente un regex da una stringa a 5.12?

risposta

11

Grazie per avermi messo sulla strada giusta, ragazzi, si scopre che stavo seriamente pensando troppo a questo. Hanno appena tagliato la linea magica e non creano il PV.

Questo è tutto quello che devi fare in Perl 5.12:

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

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

Assicurati di accettare la tua risposta :) –

+1

Mi piace quando si può sbarazzarsi di magia. :) –

+0

Anch'io! Ha molto più senso nel nuovo modo. – kristina

6

Dai un'occhiata ai commenti nella risposta this di hobbs. L'ho copiato sotto per facilità di lettura:

Gli oggetti Regex ottengono in realtà un po 'più "core" in 5.12.0, poiché ora fanno riferimento a scalari di tipo REGEXP piuttosto che a riferimenti a scalari con la magia. Questo è, però, completamente invisibile al codice utente, a meno che non si riesce a bypassare in stringa sovraccarico, nel qual caso si noterà che regex ora vengono stampati come Regexp = REGEXP (0x1234567) invece di Regexp = SCALARE (0x1234567)

Non sono particolarmente familiare con XS, ma sospetto che non sia più possibile utilizzare un valore scalare per creare la regex.