为什么'perl -i'没有就地更改文件?

Igo*_*nko 3 perl

我的设置:perl 5.20.2

正如预期的那样,使用以下代码就地更改文件:

echo abc > test.txt
perl -i -ne 's/b/x/;print' test.txt
Run Code Online (Sandbox Code Playgroud)

但是在这里,打印输出stdout并清空文件.为什么?

echo abc > test.txt
perl -i -ne 's/b/x/;push@a,$_;END{print for @a}' test.txt
Run Code Online (Sandbox Code Playgroud)

Pau*_*oub 7

END块不是-i -n魔法的一部分.

-n包含一个隐含的while (<>)(大部分)代码,并-i导致处理的文件<>被覆盖.

但是,如文档中所述,块BEGINEND隐式循环之外,并且不受影响-i.什么都没有导致你print去任何地方stdout.

  • @Igor:如果你想使用与END块相同的功能,那么请改用[eof](http://perldoc.perl.org/functions/eof.html). (4认同)
  • 使用@Miller的提示,解决方案是`perl -i -ne's/b/x /; push @ a,$ _; next除非eof;打印@a'test.txt` (2认同)