Как я могу создать QR // в Perl 5.12 от C?
-
30-09-2019 - |
Вопрос
Это работает для меня в 5.8 и 5.10, но в 5.12 мой код создает этот странный объект без QR:
# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );
Принимая во внимание, что печатая QR //, не созданная моим кодом, выглядит так:
# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;
Мой код в основном:
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);
Кто-нибудь знает, как правильно создать регулярное выражение из строки в 5.12?
Решение
Спасибо, за то, что выложили меня на правильный путь, ребята, оказывается, я серьезно перераснул это. Они просто вырезали волшебную линию и не создают PV.
Это все, что вам нужно сделать в Perl 5.12:
REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);
stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
Другие советы
Посмотрите на комментарии в это Ответ по Хоббсам. Я скопировал его ниже для удобства чтения:
Объекты Regeex фактически получают немного больше «ядро» в 5.12.0, так как теперь они ссылаются на скалярные скаляры типа Regexp, а не ссылки на скаляры с магией. Это, однако, полностью невидимый для пользовательского кода, если вам не удастся обходить перегруженную строку, в этом случае вы заметите, что Regexes теперь печатают как Regexp = Regexp (0x1234567) вместо Regexp = Scalar (0x1234567)
Я не особенно знаком с XS, но я подозреваю, что вы не можете использовать скалярную ценность, чтобы создать ваше регулярное выражение.
Perl 5.12 Изменено RegeXPS для первого классовых объектов, который вы считаете как часть тангенциальной дискуссии в Как я могу проверить, имеет ли скаляр скомпилированным Regex?.
Я не XS, так что я не знаю, что вам нужно изменить в своем коде, чтобы он работал. Поиск «REGEXP» в источниках PERL показывает исправления, которые они сделали в основные модули для использования новых материалов.