我不打算回答这个问题,因为 Sinan 已经有了我推荐的答案,但今晚我也碰巧在为即将到来的Intermediate Perl编写“文件句柄引用”一章。那是几个相关的段落,我将直接复制它们而不使它们适应您的问题:
IO::Null 和 IO::Interactive
有时我们不想将输出发送到任何地方,但我们被迫将其发送到某个地方。在这种情况下,我们可以使用 IO::Null 创建一个文件句柄,它会简单地丢弃我们给它的任何东西。它看起来和行为就像一个文件句柄,但什么也不做:
use IO::Null;
my $null_fh = IO::Null->new;
some_printing_thing( $null_fh, @args );
其他时候,我们在某些情况下想要输出,但在其他情况下不想要。如果我们登录并在终端中运行我们的程序,我们可能希望看到很多输出。但是,如果我们通过cron安排作业,我们可能不会太在意输出,只要它能完成作业。IO::Interactive 模块足够聪明,可以区分:
use IO::Interactive;
print { is_interactive } 'Bamboo car frame';
该is_interactive
子例程返回一个文件句柄。因为对子例程的调用不是一个简单的标量变量,所以我们用大括号括起来告诉 Perl 它是文件句柄。
现在您了解了“什么都不做”文件句柄,您可以替换一些每个人都倾向于编写的丑陋代码。在某些情况下你想要输出,而在某些情况下你不需要,所以很多人在某些情况下使用后表达式条件来关闭语句:
print STDOUT "Hey, the radio's not working!" if $Debug;
取而代之的是,您可以根据您想要的任何条件分配不同的值,然后
在 every 的末尾$debug_fh
去掉丑陋的:if $Debug
print
use IO::Null;
my $debug_fh = $Debug ? *STDOUT : IO::Null->new;
$debug_fh->print( "Hey, the radio's not working!" );
IO::Null 背后的魔力可能会使用间接对象表示法(例如 )发出关于“未打开的文件句柄 GLOB 上的 print()”的警告,
print $debug_fh
即使它工作得很好。我们没有直接形式的警告。