Вопрос по regex, perl – В чем разница между \ 1 и $ 1 в регулярном выражении Perl?

9

В чем разница между \ 1 и $ 1, если таковые имеются, или они взаимозаменяемы во всех ситуациях.

Пример:

s/([a-z]+),afklol/$1,bck/;
#against
s/([a-z]+),afklol/\1,bck/;

Они оба дают одинаковый результат, но есть ли разница?

Ваш Ответ

3   ответа
1

Они дают тот же результат, но $ 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";
Это потому, что вне m // или s /// \ 1 не является обратной ссылкой. (Что это на самом деле, зависит от контекста.)
9

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

/(foo|bar)baz\1/

Это будет соответствовать & quot; foobazfoo & quot; или "barbazbar" но не "foobazbar". Выcan't использование$1 там.

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

Это то, что мне было интересно, когда я увидел вопрос: могут ли они быть использованы для обратной ссылки?
16

Прямо изPerldoc Perlre:

Warning on \1 vs $1

Some people get too used to writing things like:

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

This is grandfathered for the RHS of a substitute to avoid shocking the sed addicts, but it’s a dirty habit to get into. That’s because in PerlThink, the righthand side of an "s///" is a double- quoted string. "\1" in the usual double-quoted string means a control-A. The customary Unix meaning of "\1" is kludged in for "s///". However, if you get into the habit of doing that, you get yourself into trouble if you then add an "/e" modifier.

s/(\d+)/ \1 + 1 /eg;        # causes warning under -w

Or if you try to do

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

You can’t disambiguate that by saying "{1}000", whereas you can fix it with "${1}000". The operation of interpolation should not be confused with the operation of matching a backreference.

Certainly they mean two different things on the left side of the "s///".

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