読み込んだ配列の表示方法

[上に] [前に] [次に]
高井 1999/07/29(木) 02:23:20
$num ='01';&ree;
$num ='02';&ree;
$num ='03';&ree;
$num ='04';&ree;
$num ='05';&ree;

sub ree {

    open (OUT "./$num/hozo.dat") || die"error\n";
    $line = <OUT>;
    close(OUT);

print "$line";
}

上記のような形で$numを ここでは5まで書きましたが
実際は99番程読みこんで表示しています。

この場合001〜100まで全て読み込んだ後に一気に表示
されますが、上から順に徐々に表示させるには
どのような方法があるかご教授下さい

宜しくお願いします。

ふじ 1999/07/29(木) 02:53:04
>この場合001〜100まで全て読み込んだ後に一気に表示
>されますが、
それは出力をバッファリングしている(デフォルト)からでは。
$| = 1;
をスクリプトの頭に追加しましょう。

ちなみに、私なら以下のように書きますが。

for(1..99){
$dir = sprintf("%02d", $_);
open(IN, "./$dir/hozo.dat") || die"error\n";
$line = <IN>;        #一行目しか読み込まれないけど
close IN;            #それで良いんですか?
print $line;
}

文月 1999/07/29(木) 07:38:43
>上から順に徐々に表示させるには
タイムラグを持たせるということでしょうか?
sleep関数を使えば、いいんじゃない?
sleep EXPR # EXPRは秒数。指定しないととんでもないことになる。。(^^;;;

# 外してるかな?(^^;;;;

B-Cus 1999/07/29(木) 12:38:43
> $| = 1;
でなくて、WWWサーバがバッファリングしてるという意味でない?
ここの検索CGIなんかはprintした分だけ順に表示されるよね。うちでは
どうしてもそうはならないので、僕も教えてほしいっす。

高井 1999/07/29(木) 17:04:32
>ふじさん。ご教授ありがとうございます。

早速今試した直後なのですが、
この時間帯は軽いせいか、私の書いた方法でも
$|=1;を付け加えて書いても表示は一気にされます(笑)。
99番程でもテレホ帯になると、一気に表示されるまで待ち時間が
気になるので、徐々に表示出来ればスムーズだなぁ。。 と思い
質問させて頂きました。

#! /usr/local/bin/perl

$|= 1;

print "Content-type: text/html\n\n";

for(1..99){
$dir = sprintf("%02d", $_);
open(IN, "./$dir/hozo.dat") || die"error\n";
$line = <IN>; #一行分だけ保存しているので一行読み込めれば良いです。
close IN; #随分とすっきりとしたスクリプトをご丁重に書いて頂きありがとうございます。
print $line; #早速ふじさん仕様に変更したいと思います。
}

>文月さん
 ありがとうございます。
 そちらの方法も是非試させて貰います。
 色んな手法が勉強できてタメになります。

>B-cusさん
>ここの検索CGIなんかはprintした分だけ順に表示されるよね。
   ↑そうなんです。 私が行いたい事はこのような
     表示方法です。
    
説明不足な点が有りましたらお許し下さい。
また、テレホ後にそれぞれの結果をご報告したいと思います。
 
  

B-Cus 1999/07/29(木) 23:41:15
うそ。ごめん。
> $|=1;
は、これはこれで正しい解決策です。perlのバッファリングを
OFFにしてるわけで。

ただ、それに加えてWWWサーバ側でもバッファリングしている場合も
あるってことを言いたかったです。

ので、$|=1 だけでOKな場合もありますが、ダメな場合もあります(うちのサーバ)。
Apacheでもダメなところはダメなようです。設定の問題かもしれませんが
よくわかりません。で、ダメな場合はNPHを使います。これならうちでも
うまくいきました。
# http://www.tohoho-web.com/wwwcgi4.htm#NphScript

当然ですが、出力するのはブラウザ側で少しずつ順に表示できるような
構造でないといけません。適当に改行(<BR>)を入れるとか、<TABLE>で囲まないとか。

高井 1999/07/29(木) 23:43:29
テレホ帯で上記のスクリプト実行結果を報告します。

$|= 1;

を挿入したスクリプトを動かしてみましたが
やはり表示は徐々にではなく、一気にされました。

ちょっと気になったもので、読み込む配列を従来の01〜99 から
01〜500に増やして実行した所、徐々に表示されました。

読み込む配列(データ量)が問題なのですかね?

少々、もう少し幾つかのパターンを試してみます。
何か気になる部分がありましたらまた報告させて頂きます。

高井 1999/07/29(木) 23:50:11
投稿記事を書いてる間にB-cusさんの投稿がありました。
有り難うございます。
早速そちらの手法も試させて頂きます。

情報が足りなくて済みませんでした。
私の使用している環境は、Apache  perl5 です。

>当然ですが、出力するのはブラウザ側で少しずつ順に表示できるような
>構造でないといけません。適当に改行(<BR>)を入れるとか、<TABLE>で囲まないとか。
print $line;  
print $line<BR>;
print $line<P>;

等で試してみましたが、別段変わりはありませんでしたが
もう少しガンガン細かい所を変更しながらテストします。

また、ご報告させて頂きます。
情報不足・説明不足な点がありましたらお許し下さい
ご指摘頂ければ幸いです。

高井 1999/07/30(金) 00:13:06
うわーー  成功しました 大感激です。
見事に徐々に表示されましたー 気持ちよすぎますー

私の最初のスクリプトを大幅にふじさん仕様に変更し
B-cusさんから押しえて頂いたnph-にしてみたところ
見事に徐々に上から段々と表示されました。

でも、nph-。。 これって凄いですね。。 これでサーバへの負荷も
軽減されるならば、徐々に表示させる目的とは別に
使用しているCGIスクリプト全てに適用しようと思います。

最終的にはこのようにしました。

#! /usr/local/bin/perl

print "HTTP/1.0 200 OK\n";
$| = 1;

for(1..99){
$dir = sprintf("%02d", $_);
open(IN, "./$dir/hozo.dat") || die"error\n";
$line = <IN>;
close IN;
print $line<BR>;
}

色々とどうも有り難うございました。
大変助かると共に勉強になりました。

高井 1999/07/30(金) 00:13:48
[[解決]]
度々済みません。 解決マークを入れ忘れていました。

B-Cus 1999/07/30(金) 00:20:41
> 徐々に表示させる目的とは別に使用しているCGIスクリプト
> 全てに適用しようと思います。
バッファリングというのは、速度向上、データ量軽減のために
行われているので、必要ないなら使うべきではないと思います。

なお、実際にデータ量がこれだけ増える、これだけ遅くなる
というのは測ってません。誰か調べて。

> print "HTTP/1.0 200 OK\n";
Content-type は必要ないんでしたっけ?

B-Cus 1999/07/30(金) 00:24:26
追加。あと、NPHを使うということはサーバの付けるヘッダがないわけで、
それなりの出力を自分でしといた方がいいと思います。
Server,Date,Last-Modified,Content-Lengthなど。

[上に] [前に] [次に]