什么是默认的`perl`打印目标?

时间:2015-02-28 16:22:01

标签: perl

我假设print "foo"只是print STDOUT "foo"的快捷方式。

但是我注意到(至少)与-i开关组合,这个假设不再适用:

perl -ni 'print $_' file

这根本不会改变文件的内容。

perl -ni 'print STDOUT $_' file

然而,这会将内容打印到终端并将文件留空。

因此问题:打印的默认目标是什么?即第一次打印到哪里打印?

perldoc -f print说:

  

要将默认输出句柄设置为STDOUT以外的其他句柄,请使用选择操作。

显然perl在内部使用select操作将默认输出句柄设置为其他内容。有没有办法明确指定当前的默认输出句柄?

这样我就能写出像

这样的东西
perl -i -wne 'print {/b/ ? STDOUT : XXX } $_' file

构建grep,删除所有打印的行。

2 个答案:

答案 0 :(得分:4)

print的默认文件句柄由select函数控制。它默认为STDOUT,但可以随时更改。

引用the documentation

  
      
  • 选择FILEHANDLE
  •   
  • 选择

         

    返回当前选定的文件句柄。如果提供了FILEHANDLE,则设置新的当前默认文件句柄以进行输出。这有   两个效果:首先,writeprint没有默认的文件句柄   这个FILEHANDLE。其次,引用与输出相关的变量   将引用此输出通道。

  •   

如果查看documentation for the -i option,您会看到该扩展包含行select(ARGVOUT)。这就是导致输出返回到您正在编辑的文件的原因。

ARGVOUT仅在-i处理过程中很特殊,但它确实在那里工作:

$ cat foo
a1
b1
a2
b2
$ perl -i -wne 'print {/b/ ? STDOUT : ARGVOUT } $_' foo
b1
b2
$ cat foo 
a1
a2

您也可以使用perl -i -wne 'print {/b/ ? STDOUT : select } $_' foo,因为ARGVOUT将是当前选定的文件句柄。

答案 1 :(得分:0)

它打印到当前选定的句柄,默认为STDOUT。您可以使用单参数形式select自行更改所选句柄,就地编辑模式-i标记/ $^I会自动为您选择目标文件(请参阅perlrun中的-i代码等同于-i的代码。