Каково различие между \1 и 1$ в Perl regex?

модуль simplejson просто в 1,5 раза быстрее, чем json (на моем компьютере с simplejson 2.1.1 и Python 2.7 x86).

Если хотите, вы можете попробовать тест: http://abral.altervista.org/jsonpickle-bench.zip На моем ПК simplejson работает быстрее, чем cPickle. Я также хотел бы знать ваши тесты!

Вероятно, как сказал Коуди, разница между simplejson и json заключается в том, что simplejson включает _speedups.c. Итак, почему разработчики Python не используют simplejson?

10
задан brian d foy 2 July 2009 в 14:11
поделиться

3 ответа

Прямо из perldoc perlre :

Предупреждение о \ 1 vs $ 1

Некоторые люди слишком привыкают к письму например:

 $ pattern = ~ s / (\ W) / \\\ 1 / g;

Это унаследовано от правой руки замените, чтобы не шокировать sed наркоманов, но это грязная привычка получать в. Это потому, что в PerlThink правая часть "s ///" - это Строка в двойных кавычках. "\ 1" в обычная строка в двойных кавычках означает Ctrl + A. Обычное значение Unix of "\ 1" вставлено в "s ///". Однако, если вы приобретете привычку делая это, вы попадаете в проблема, если вы затем добавите "/ e" модификатор.

 s / (\ d +) / \ 1 + 1 / например; # вызывает предупреждение под -w

Или если вы попытаетесь выполнить

 s / (\ d +) / \ 1000 /;

Вы не можете устранить неоднозначность, сказав "{1} 000", тогда как вы можете исправить это с помощью «{1} 000 $». Работа интерполяцию не следует путать с операцией сопоставления обратная ссылка.

Конечно, они означают два разных элементы слева от "s ///".

16
ответ дан 3 December 2019 в 15:52
поделиться

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

/(foo|bar)baz\1/

Это будет соответствовать «foobazfoo» или «barbazbar», но не «foobazbar». Вы не можете использовать там $ 1 .

Во всех других случаях я использую $ 1 и родственников, потому что есть слишком много ошибок при использовании других обозначений . См. perlre для всех кровавых подробностей.

10
ответ дан 3 December 2019 в 15:52
поделиться

Они дают тот же результат, но $ 1 сохраняет свое значение, а \ 1 - нет. Попробуйте следующее:

s/([a-z]+),afklol/$1,bck/;
print "\$1 is $1\n";
#against
s/([a-z]+),afklol/\1,bck/;
print "\\1 is \1\n";
1
ответ дан 3 December 2019 в 15:52
поделиться
Другие вопросы по тегам:

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