[perl] [xs] Регулярные выражения
Есть проблема, не понятно как использовать регулярки в xs. В инете нарыл пример http://www.mail-archive.com/perl-xs@perl.org/msg02059.html
SV*
regex_once(SV *regex_ref, SV *text) {
SV *regex_sv;
regexp *rx;
char *stringarg, *stringbeg, *stringend;
MAGIC *mg = NULL;
if (!SvROK(regex_ref)) croak("not a ref");
regex_sv = SvRV(regex_ref);
if (!SvMAGICAL(regex_sv)) croak("No magic");
mg = mg_find(regex_sv, PERL_MAGIC_qr);
rx = (REGEXP*)mg->mg_obj;
stringbeg = SvPV_nolen(text);
stringarg = stringbeg;
stringend = SvEND(text);
pregexec(rx, stringarg, stringend, stringbeg, 1, text, 1);
return newSVpv(stringbeg, rx->endp[0]);
}
SV *mask;
mask = *hv_fetch( hv, "mask", 4, 0);
SV *path_info;
path_info = *hv_fetch( hv, "path_info", 9, 0);
if (SvRXOK(mask)) {
printf("\tmask is regexp\n");
REGEXP *rx;
rx = SvRX(mask);
char *strarg, *strbeg, *strend;
strbeg = SvPV_nolen(path_info);
strarg = strbeg;
strend = SvEND(path_info);
pregexec( rx, strarg, strend, strbeg, 1, path_info, 1 );
printf("\t\treg[%s][%s][%s]\n",strarg,strbeg,strend);
}
- Не ясно что вообще должно быть на выходе
- Ловлю ошибку, если делать как в примере
warning: assignment from incompatible pointer type error: 'REGEXP' has no member named 'endp'
- В документации функция pregexec числится как недокументированная ( http://perldoc.perl.org/perlapi.html#Undocumented-functions )
Нужно просто поймать true/false при исполнении регулярки на строку.