Как я могу создать qr//в Perl 5.12 из C?
Это работает для меня в 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?
Ответы
Ответ 1
Спасибо, что поставил меня на правильный путь, ребята, оказывается, я серьезно задумался над этим. Они просто вырезают магическую линию и не создают PV.
Это все, что вам нужно сделать в Perl 5.12:
REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);
stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
Ответ 2
Взгляните на комментарии в этом от hobbs. Я скопировал его ниже для удобства чтения:
Объекты Regex фактически получают чуть больше "ядра" в 5.12.0, так как теперь они ссылаются на скаляры типа REGEXP, а не на ссылки на скаляры с магией. Это, однако, полностью невидимо для кода пользователя, если только вам не удастся обойти перегруженную строковую обработку, и в этом случае вы заметите, что регулярные выражения теперь печатаются как Regexp = REGEXP (0x1234567) вместо Regexp = SCALAR (0x1234567)
Я не особенно знаком с XS, но я подозреваю, что вы больше не можете использовать скалярное значение для создания своего регулярного выражения.
Ответ 3
Perl 5.12 изменил регулярные выражения как объекты первого класса, которые вы найдете как часть тангенциального обсуждения в Как проверить, имеет ли скаляр скомпилированное регулярное выражение?.
Я не человек XS, поэтому я не знаю, что вам нужно изменить в коде, чтобы он работал. Поиск "REGEXP" в источниках perl показывает исправления, которые они сделали для основных модулей, для использования нового материала.