regex - lector - ¿Cómo puedo crear un qr// en Perl 5.12 desde C?
lector qr gratis (3)
Gracias por ponerme en el camino correcto, chicos, resulta que estaba pensando demasiado en 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);
Esto ha funcionado para mí en 5.8 y 5.10, pero en 5.12 mi código crea este extraño objeto no-qr:
# running "print Dumper($regex)"
$VAR1 = bless( do{/(my $o = '''')}, ''Regexp'' );
Mientras que la impresión de un qr // no creado por mi código se ve así:
# 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?
Eche un vistazo a los comentarios en esta respuesta por hobbs. Lo he copiado a continuación para facilitar la lectura:
Los objetos Regex en realidad obtienen un poco más de "núcleo" en 5.12.0, ya que ahora son referencias a escalares de tipo REGEXP en lugar de referencias a escalares con magia. Sin embargo, esto es completamente invisible para el código de usuario, a menos que logre eludir la sobreescritura sobrecargada, en cuyo caso notará que las expresiones regulares ahora se imprimen como Regexp = REGEXP (0x1234567) en lugar de Regexp = SCALAR (0x1234567)
No estoy especialmente familiarizado con XS, pero sospecho que ya no puedes usar un valor escalar para crear tu expresión regular.
Perl 5.12 ha cambiado las expresiones regulares para que sean objetos de primera clase , que encontrará como parte de la discusión tangencial en ¿Cómo puedo verificar si un escalar tiene una expresión regular compilada? .
No soy una persona XS, por lo que no sé qué necesitas cambiar en tu código para que funcione. La búsqueda de ''REGEXP'' en las fuentes perl muestra las correcciones que hicieron a los módulos centrales para usar las cosas nuevas.