2010-04-21 19 views
14

Esto ha estado trabajando para mí en 5.8 y 5.10, pero en 5,12 mi código crea este objeto no qr raro:¿Cómo puedo crear un qr // en Perl 5.12 desde C?

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

Mientras que la impresión de un qr no // creado por mi código es el siguiente:

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

Mi código es básicamente:

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

Alguien sabe cómo crear correctamente una expresión regular de una cadena en 5.12?

Respuesta

11

Gracias por ponerme en el camino correcto, chicos, resulta que estaba pensando demasiado esto. Simplemente cortan la línea mágica y no crean el PV.

Esto es todo lo que necesita hacer en Perl 5.12:

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

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

Asegúrese de que acepta su respuesta :) –

+1

me gusta cuando usted puede deshacerse de la magia. :) –

+0

Yo también! Tiene mucho más sentido la nueva forma. – kristina

6

Echa un vistazo a los comentarios en this respuesta por hobbs. He copiado por debajo para facilitar la lectura:

objetos Regex realidad obtener un poco más "núcleo" en 5.12.0, ya que son ahora las referencias a los escalares de tipo REGEXP en lugar de referencias a los escalares con la magia. Esto es, sin embargo, completamente invisible para el código de usuario, a menos que se las arregla para pasar por alto stringification sobrecargada, en cuyo caso se dará cuenta de que ahora se imprimen como expresiones regulares Regexp = REGEXP (0x1234567) en lugar de Regexp = ESCALAR (0x1234567)

No estoy especialmente familiarizado con XS, pero sospecho que ya no puede usar un valor escalar para crear su expresión regular.

Cuestiones relacionadas