为什么$ _在单个替换和全局替换之间没有变化

sta*_*106 3 perl

我有这四个陈述

$ 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

$
Run Code Online (Sandbox Code Playgroud)

第二种情况是怎么回事?为什么不修改$ _?

sti*_*bit 6

因为“更多本地化” $_是循环之一。观察如何

perl -E "\$_ = 'abc'; print(\$_) for 1 .. 2; print(\$_);"
Run Code Online (Sandbox Code Playgroud)

打印12abc而不是abcabcabc

来自“ perlvar-特殊变量-常规变量”

  • $_ ...

    这是$_即使您不使用Perl也会假设的地方:

    ...

    • foreach如果没有其他变量,则循环中的默认迭代器变量。

“ perlsyn-Foreach循环”中

foreach关键字实际上是对一个同义词for的关键字,这样你就可以使用。如果省略VAR,$_则将其设置为每个值。


rpl*_*iko 5

在for循环中,循环变量是作用域的。因此,命令

$x=17; for $x (1..2) { say $x } say $x;
Run Code Online (Sandbox Code Playgroud)

导致在$x退出循环后恢复为原始值:

1
2
17
Run Code Online (Sandbox Code Playgroud)

隐式变量$_也不例外:您从命令中获得相同的结果

$_=17; say for (1..2); say;
Run Code Online (Sandbox Code Playgroud)