我正在一个用户可以传递-o file
选项的程序中工作,然后应该将输出定向到该文件。否则,它应该转到stdout。
要检索我正在使用模块getopt long的选项,那不是问题。问题是,如果未设置该选项,我想创建一个文件句柄,该文件或为其分配标准输出。
if ($opt) {
open OUTPUT, ">", $file;
} else {
open OUTPUT, # ???
}
那是因为这样,以后在我的代码中我可以:
print OUTPUT "...";
不用担心OUTPUT
是stdout还是用户指定的文件。这可能吗?如果我在这里设计不好,请告诉我。
答案 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);