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

时间:2019-04-10 20:36:25

标签: perl

我有这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 个答案:

答案 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;