Perl:获取在cgi-bin脚本中使用stdin的句柄

时间:2010-06-17 09:41:17

标签: perl filehandle

在Windows服务器上使用perl 5.8.8我正在编写一个perl cgi脚本,使用Archive :: Zip来创建一个必须由用户下载的zip:这方面没有问题。 zip在内存中管理,没有物理文件使用临时文件或其他任何内容写入磁盘。我想知道如何允许zip下载将流写入浏览器。我所做的就是:

binmode (STDOUT);
$zip->writeToFileHandle(*STDOUT, 0);

但是我觉得将STDOUT作为文件句柄的方式不安全。它是否正确且稳健?有一个更好的方法?

非常感谢您的建议

2 个答案:

答案 0 :(得分:5)

你在做什么看起来很好!

答案 1 :(得分:3)

这是展示virtue of Impatience的好机会。

程序员喜欢将重复的常量文字分解出来,并将它们放入常量类型的容器中。 (但我只是在这里使用一个变量,以免分散注意力。)

use IO::File qw();
my $handle = bless(\*STDOUT => 'IO::File')
    or die $OS_ERROR;
# Why not just `$handle = STDOUT`? Code above is necessary
# because using bare STDOUT invokes on IO::Handle only
# which does not have the binmode method.
⋮
$handle->binmode(1);
$handle->print('something');

这看起来并不像是一场胜利,因为现在有比以前更多的代码。一旦你决定不再打印到STDOUT,就会获得巨大的回报,而不是真正的文件。或许你想要输出。然后你只需要改变一行代码而不是几行代码。

my $handle = IO::File->new('/var/log/cgi', 'a')
    or die $OS_ERROR;
# method calls on $handle stay the same as before