Estoy trabajando en algún código que necesite serializar expresiones regulares de Perl, incluidos los indicadores de expresiones regulares. Solo se admite un subconjunto de indicadores, por lo que necesito detectar cuando indicadores no compatibles como /u
se encuentran en el objeto de expresión regular.Cómo introspectar expresiones regulares en la API de Perl
La versión actual del código hace esto:
static void serialize_regex_flags(buffer *buf, SV *sv) {
char flags[] = {0,0,0,0,0,0};
unsigned int i = 0, f = 0;
STRLEN string_length;
char *string = SvPV(sv, string_length);
procesa manualmente string
char-por-char para encontrar banderas.
El problema aquí es que la stringificación de los indicadores de expresiones regulares ha cambiado (creo que en Perl 5.14), por ejemplo, (?i-xsm:foo)
a (?^i:foo)
, lo que hace que analizar un dolor.
Pude consultar la versión de perl
, o simplemente escribir el analizador para manejar ambos casos, pero algo me dice que debe haber un método superior de introspección disponible.
Creo que este es el camino para ir, gracias – friedo
@friedo, se agregó el código XS (no probado). – ikegami
Gracias, @ikegami. Pude obtener lo que necesitaba con su código C como punto de partida. Una cosa a tener en cuenta es que los valores de retorno deben aparecer en el orden inverso (para que 'flags_sv' salga primero en lugar de segundo.) – friedo