Pracuję nad kodem, który wymaga serializowania wyrażeń regularnych Perla, w tym dowolnych flag regex. Obsługiwany jest tylko podzbiór flag, więc muszę wykryć, czy nieobsługiwane flagi, takie jak /u
, znajdują się w obiekcie regex.Jak introspekcja wyrażeń regularnych w interfejsie API Perl
Aktualna wersja kodu wykonuje to:
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);
Następnie ręcznie przetwarza string
char-by-char znalezienia flagi.
Problem w tym, że zmieniono szykowanie flag regex (myślę, że w Perlu 5.14) z np. (?i-xsm:foo)
do (?^i:foo)
, co sprawia, że parsowanie sprawia ból.
Mogę sprawdzić wersję perl
, lub po prostu napisać parser, aby obsłużyć oba przypadki, ale coś mi mówi, że musi być dostępna lepsza metoda introspekcji.
myślę, że to jest droga aby przejść, dziękuję – friedo
@friedo, dodano (untested) kod XS. – ikegami
Dzięki, @ikegami. Udało mi się zdobyć to, czego potrzebowałem z twoim kodem C jako punktem wyjścia. Należy zwrócić uwagę na to, że wartości zwracane muszą być wyświetlane w odwrotnej kolejności (tak więc 'flags_sv' wychodzi najpierw zamiast drugiego). – friedo