почему $ _ не меняется между одиночной и глобальной заменой - PullRequest
3 голосов
/ 10 апреля 2019

У меня есть эти 4 утверждения

$ perl -e ' $in="axaxaxhhhh"; $in=~s/a/p/ for 1..2 ; print $in '  # 1. Ok
pxpxaxhhhh

$ perl -e ' $_="axaxaxhhhh"; $_=~s/a/p/ for 1..2 ; print $_ ' # 2. Why not working?
axaxaxhhhh

$ perl -e ' $_="axaxaxhhhh"; $_=~s/a/p/g; print $_ ' # 3.good
pxpxpxhhhh

$ perl -e ' $_="axaxaxhhhh"; $_=~s/a/p/; print $_ ' # 4.good 
pxaxaxhhhh

$

что происходит во втором случае?почему он не изменяет $ _?

Ответы [ 2 ]

6 голосов
/ 10 апреля 2019

Потому что «более локальный» $_ является одним из цикла.Обратите внимание, как

perl -E "\$_ = 'abc'; print(\$_) for 1 .. 2; print(\$_);"

печатает 12abc вместо abcabcabc.

От "perlvar - СПЕЦИАЛЬНЫЕ ПЕРЕМЕННЫЕ - Общие переменные" :

  • $_ ...

    Вот места, где Perl примет $_, даже если вы его не используете:

    ...

    • Переменная итератора по умолчанию в цикле foreach, если не указана другая переменная.

И от "perlsyn - Foreach Loops" :

Ключевое слово foreach фактически является синонимом для ключевого слова for, поэтому вы можете использовать любое из них.Если VAR опущен, для каждого значения устанавливается $_.

5 голосов
/ 10 апреля 2019

В цикле for переменная цикла находится в области видимости.Таким образом, команда

$x=17; for $x (1..2) { say $x } say $x;

приводит к тому, что $x восстанавливается к исходному значению после выхода из цикла:

1
2
17

Неявная переменная $_ не делает исключения: выполучить тот же результат от команды

$_=17; say for (1..2); say;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...