2010-04-21 4 views
14

Это работает для меня в 5.8 и 5.10, а в 5.12 мой код создает этот странный, не Qr объект:Как создать qr // в Perl 5.12 из C?

# running "print Dumper($regex)" 
$VAR1 = bless(do{\(my $o = '')}, 'Regexp'); 

В то время как печать квартер // не создан мой код выглядит следующим образом:

# 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?

ответ

11

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

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

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

stash = gv_stashpv("Regexp", 0); 
sv_bless(regex, stash); 
+1

Убедитесь, что вы принимаете ваш ответ :) –

+1

мне нравится, когда вы можете избавиться от магии. :) –

+0

Я тоже! Это делает новый смысл более понятным. – kristina

6

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

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

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

5

Perl 5.12 changed regexps to be first class objects, который вы найдете как часть тангенциального обсуждения в How do I check if a scalar has a compiled regex it in?.

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

 Смежные вопросы

  • Нет связанных вопросов^_^