【问题标题】:What is the default `perl` print target?默认的 `perl` 打印目标是什么?
【发布时间】:2015-02-28 16:22:00
【问题描述】:

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

但是我注意到(至少)结合-i 开关,这个假设不再成立:

perl -ni 'print $_' file

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

perl -ni 'print STDOUT $_' file

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

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

perldoc -f print 说:

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

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

这样我就可以写出类似的东西

perl -i -wne 'print {/b/ ? STDOUT : XXX } $_' file

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

【问题讨论】:

  • 您是否查看了有关 `-i` 标志的文档?你学到了什么?
  • 是的,我首先在man perlrun 中寻找-i 选项。我在那里找不到答案。

标签: perl


【解决方案1】:

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

引用the documentation

  • 选择文件句柄
  • 选择

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

如果您查看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 将是当前选定的文件句柄。

【讨论】:

  • ARGVOUT 仅在执行-i 下的代码期间是特殊的。如果您认为我另有暗示,我很抱歉。
  • 使用不带参数的select 获取当前选定的文件句柄。
【解决方案2】:

它打印到当前选择的句柄,默认为STDOUT。您可以使用select的单参数形式自己更改选择的句柄,并且就地编辑模式-i标志/$^I会自动为您选择目标文件(参见@987654322中-i的描述@ 代码相当于 -i 所做的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多