我有这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
$
第二种情况是怎么回事?为什么不修改$ _?
答案 0 :(得分:6)
因为“更本地” $_
是循环之一。观察如何
perl -E "\$_ = 'abc'; print(\$_) for 1 .. 2; print(\$_);"
打印12abc
而不是abcabcabc
。
来自"perlvar -- SPECIAL VARIABLES -- General Variables":
$_
...在这里,即使您不使用,Perl也会假设
$_
:...
- 如果没有提供其他变量,则
foreach
循环中的默认迭代器变量。
并且来自"perlsyn -- Foreach Loops":
foreach
关键字实际上是for
关键字的同义词,因此您可以使用其中任何一个。如果省略VAR,则将$_
设置为每个值。
答案 1 :(得分:5)
在for循环中,循环变量是作用域的。因此,命令
$x=17; for $x (1..2) { say $x } say $x;
导致$x
离开循环后恢复为原始值:
1
2
17
隐式变量$_
也不例外:您从命令中获得了相同的结果
$_=17; say for (1..2); say;