Как я могу создать qr // в Perl 5.12 из C? - PullRequest
14 голосов
/ 21 апреля 2010

Это работало для меня в 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?

Ответы [ 3 ]

12 голосов
/ 21 апреля 2010

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

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

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

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
6 голосов
/ 21 апреля 2010

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

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

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

5 голосов
/ 21 апреля 2010

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

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

...