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

发布于 2024-11-29 07:14:04 字数 421 浏览 0 评论 0原文

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

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

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

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

print OUTPUT "...";

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

I'm working in a program where the user can pass a -o file option, and output should be then directed to that file. Otherwise, it should go to stdout.

To retrieve the option I'm using the module getopt long, and that's not the problem. The problem is that I want to create a file handle with that file or assign stdout to it if the option was not set.

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

That's because this way, later in my code I can just:

print OUTPUT "...";

Without worrying if OUTPUT is stdout or a file the user specified. Is this possible? If I'm doing a bad design here, please let me know.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

前事休说 2024-12-06 07:14:04

这将是一个关于如何使用 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."

This would be a good example on how to use 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."
ι不睡觉的鱼゛ 2024-12-06 07:14:04

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

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

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

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

Look at the open documentation. The easiest is to reopen STDOUT itself and not use a filehandle in your code.

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

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

(Add some error checking of course.)

笑饮青盏花 2024-12-06 07:14:04

无法分配诸如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);

A constant item such as OUTPUT cannot be assigned. Using a variable such as $output works better. For example:

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");
    }
}

That way the program can print to standard output and/or to an output file:

print $output "This might go to a file\n";
print "Data written to $display_filename\n" if ($verbose);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文