我假设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
,删除所有打印的行。
答案 0 :(得分:4)
print
的默认文件句柄由select
函数控制。它默认为STDOUT
,但可以随时更改。
- 选择FILEHANDLE
选择
返回当前选定的文件句柄。如果提供了FILEHANDLE,则设置新的当前默认文件句柄以进行输出。这有 两个效果:首先,
write
或
如果查看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)