打开文件句柄或分配标准输出

时间:2011-08-14 19:21:18

标签: perl stdout filehandle

我正在一个用户可以传递-o file选项的程序中工作,然后应该将输出定向到该文件。否则,它应该转到stdout。

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

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

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

print OUTPUT "...";

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

3 个答案:

答案 0 :(得分:8)

这是如何使用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."

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:0)

不能分配诸如 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);