【问题标题】:Open filehandle or assign stdout打开文件句柄或分配标准输出
【发布时间】:2011-08-14 19:21:17
【问题描述】:

我正在使用用户可以传递-o file 选项的程序,然后应将输出定向到该文件。否则,它应该转到标准输出。

要检索选项,我正在使用模块 getopt long,这不是问题。问题是我想使用该文件创建一个文件句柄或如果未设置该选项,则为其分配标准输出。

if ($opt) {
    open OUTPUT, ">", $file;
} else {
    open OUTPUT, # ???
}

那是因为这样,稍后在我的代码中我可以:

print OUTPUT "...";

不用担心OUTPUT 是标准输出还是用户指定的文件。这可能吗?如果我在这里做了不好的设计,请告诉我。

【问题讨论】:

标签: perl stdout filehandle


【解决方案1】:

这将是如何使用select 的一个很好的例子。

use strict;
use warnings;
use autodie;

my $fh;
if ($opt) {
    open $fh, '>', $file;
    select $fh;
}

print "This goes to the file if $opt is defined, otherwise to STDOUT."

【讨论】:

  • 不错的 TLP,非常感谢。关于 Perl 我还有很多东西需要学习……但是,我不确定这是否可以在 while (<>) 中工作,这不是我的情况,只是考虑一下。在这些情况下,重新打开标准输出似乎是一个更好的选择,考虑到无论如何我都必须标记打印。
  • @cmre 哦,你编辑了你的评论。好吧,这与重新打开 STDOUT 一样有效。 print STDOUT "foo" 本质上与print "foo" 相同,因此您无需指定文件句柄。我不太确定您的顾虑是什么,但您应该使用您觉得合适的解决方案。
  • 是的,刚刚编辑过,抱歉。问题是print "something" 中的while (<>) {...} 会将其输出到选定的文件,对吧?或许不是,我刚开始使用 Perl,现在它变得非常混乱:P
  • @cmre 我的意思是,有了这个解决方案,你不需要使用print OUTPUT,你可以使用print。
  • @cmre 用于输入。 select() 和 print() 用于输出。它们不相关。
【解决方案2】:

查看open 文档。最简单的方法是重新打开 STDOUT 本身,而不是在代码中使用文件句柄。

if ($opt) {
    open(STDOUT, ">", $file);
}
...

print "this goes to $file or STDOUT\n";

(当然要添加一些错误检查。)

【讨论】:

  • 如果程序无论如何都将某些内容打印到标准输出,而其他一些输出(例如 shell 命令)会输出到文件,或者,也可以选择输出到标准输出,该怎么办?
【解决方案3】:

无法分配OUTPUT 等常量项。使用诸如$output 之类的变量效果更好。例如:

my ($output, $display_filename);
if ($opt)
{
    if ($opt eq '-')
    {
        $display_filename = 'stdout';
        $output = *STDOUT;
    }
    else
    {
        $display_filename = $opt;
        open($output, '>', $opt) or
            die("Cannot open $opt for writing: $!\n");
    }
}

这样程序可以打印到标准输出和/或输出文件:

print $output "This might go to a file\n";
print "Data written to $display_filename\n" if ($verbose);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多