0

Windows サーバーで perl 5.8.8 を使用して、Archive::Zip を使用して perl cgi スクリプトを作成し、ユーザーがダウンロードする必要がある zip をその場で作成しています。その側に問題はありません。zip はメモリ内で管理され、一時ファイルなどを使用して物理ファイルがディスクに書き込まれることはありません。ブラウザにストリームを書き込むzipダウンロードを許可する方法を考えています。私がやったことは次のようなものです:

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

しかし、STDOUTをファイルハンドルとして取得するこの方法については不安を感じています。それは正しく堅牢ですか?より良い方法はありますか?

アドバイスありがとうございます

4

2 に答える 2

5

あなたがしていることはうまく見えます!

于 2010-06-17T09:47:23.883 に答える
3

これは焦りの美徳を示す良い機会です。

プログラマーは、定数リテラルの繰り返しを除外して、それらを定数型コンテナーに入れることを好みます。(ただし、重要な部分から気をそらさないように、ここでは単純に変数を使用します。)

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最終的にもう印刷するのではなく、実際のファイルに印刷することに決めた時点で、大きな見返りが得られます。または、出力をティーにしたいかもしれません。その後、数行ではなく 1 行のコードを変更するだけで済みます。

my $handle = IO::File->new('/var/log/cgi', 'a')
    or die $OS_ERROR;
# method calls on $handle stay the same as before
于 2010-06-17T11:29:53.163 に答える