Вопрос

Это работает для меня в 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 показывает исправления, которые они сделали в основные модули для использования новых материалов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top