verificacion lector gratis google escanear codigos codigo regex perl xs qr-operator

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.