У меня есть эти 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
$
что происходит в моем втором случае?. почему он не изменяет $_?
Цикл foreach использует псевдонимы $_
для скаляров, возвращаемых 1..2
. Вы выполняете замену этих временных скаляров.
@ stack0114106 "застрял на работе" - хорошо быть занятым работой. Я имею в виду, я надеюсь, что это хорошая работа :)
Потому что «более локальный» $_
— это цикл. Наблюдайте, как
perl -E "\$_ = 'abc'; print(\$_) for 1 .. 2; print(\$_);"
печатает 12abc
вместо abcabcabc
.
Из "perlvar -- СПЕЦИАЛЬНЫЕ ПЕРЕМЕННЫЕ -- Общие переменные":
$_
...Here are the places where Perl will assume
$_
even if you don't use it:...
- The default iterator variable in a
foreach
loop if no other variable is supplied.
И от "perlsyn -- циклы по каждому элементу":
The
foreach
keyword is actually a synonym for thefor
keyword, so you can use either. If VAR is omitted,$_
is set to each value.
Я предлагаю изменить -E
на -e
, так как здесь не используются никакие функции. (Думаю, это просто использовало ОП, но это также было изменено. См. Мой комментарий под ОП)
(этот комментарий удален - суть в том, что есть причины против использования -E
)
В цикле for переменная цикла имеет область действия. Таким образом, команда
$x=17; for $x (1..2) { say $x } say $x;
приводит к тому, что $x
восстанавливается до исходного значения после выхода из цикла:
1
2
17
Неявная переменная $_
не исключение: тот же результат вы получите от команды
$_=17; say for (1..2); say;
@zdim .. спасибо .. только что обновил .. кстати застрял на работе и через некоторое время зайду сюда ..