Как я могу создать qr//в Perl 5.12 от C?

Это работало на меня в 5,8 и 5.10, но в 5,12 моих кодах создает этот странный объект non-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);

Кто-либо знает, как правильно создать regex из строки в 5,12?

14
задан David 18 July 2015 в 22:29
поделиться

3 ответа

Спасибо, что направили меня на правильный путь, ребята, оказывается, я серьезно над этим задумывался. Они просто вырезают магическую линию и не создают клип.

Это все, что вам нужно сделать в Perl 5.12:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
12
ответ дан 1 December 2019 в 12:26
поделиться

Взгляните на комментарии в этот ответ Хоббса. Я скопировал это ниже для удобства чтения:

Объекты Regex фактически получили немного больше «ядра» в 5.12.0, поскольку теперь они ссылаются на скаляры типа REGEXP, а не на ссылки на скаляры с помощью магии. Однако это полностью невидимо для пользовательского кода, если вам не удастся обойти перегруженную строковую обработку. В этом случае вы заметите, что регулярные выражения теперь печатаются как Regexp = REGEXP (0x1234567) вместо Regexp = SCALAR (0x1234567)

I ' m не особенно знаком с XS, но я подозреваю, что вы больше не можете использовать скалярное значение для создания своего регулярного выражения.

6
ответ дан 1 December 2019 в 12:26
поделиться

Perl 5.12 изменил регулярные выражения на объекты первого класса , которые вы найдете в рамках касательного обсуждения в Как мне проверить, есть ли в скаляре скомпилированное регулярное выражение? .

Я не человек XS, поэтому я не знаю, что вам нужно изменить в своем коде, чтобы он заработал. Поиск «REGEXP» в источниках perl показывает исправления, которые они внесли в основные модули для использования нового материала.

5
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: