Sto lavorando a un codice che ha bisogno di serializzare regex Perl, comprese eventuali bandiere regex. Solo un sottoinsieme di flag è supportato, quindi devo rilevare quando flag non supportati come /u
si trovano nell'oggetto espressioni regolari.Come l'introspezione regex nella API Perl
La versione corrente del codice fa questo:
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);
quindi elabora manualmente string
char-by-char di trovare bandiere.
Il problema qui è che l'in stringa di bandiere regex cambiato (penso in Perl 5.14) da esempio (?i-xsm:foo)
a (?^i:foo)
, che rende l'analisi un dolore.
Potrei controllare la versione di perl
, o semplicemente scrivere il parser per gestire entrambi i casi, ma qualcosa mi dice che ci deve essere un metodo superiore di introspezione disponibile.
Credo che questo sia il modo in cui per andare, grazie – friedo
@friedo, aggiunto codice XS (non testato). – ikegami
Grazie, @ikegami. Sono stato in grado di ottenere quello che mi serviva con il tuo codice C come punto di partenza. Una cosa da notare è che i valori di ritorno devono essere spuntato in ordine inverso (quindi 'flags_sv' si stacca prima al posto di secondo.) – friedo