"$|=1"とは、具体的にはどういうことでしょうか?
[上に]
[前に]
[次に]
ken
1998/02/05(木) 01:10:50
"$|=1"とすると「出力をバッファリングしない」とのことですが、
具体的にはどういうことなんでしょうか?
また、貴ホームページの検索システムのスクリプトにも記述されて
おりました。
ご回答をよろしくお願いいたします。
B-Cus
1998/02/05(木) 01:27:27
printは(printに限ったことではないけど)、
改行がないと実際にprintしません。
print "a";
print "b";
print "c\n";
とあると、実際には"abc\n"という文章を一気に
出力します。それがバッファリングです。perl
に限らずUNIX一般でバッファリングという機構が
あります。
なぜなら「aを画面に表示(あるいはファイルに出力)、
bを画面に表示、cを画面に表示」とするよりも、
「abcを画面に表示」とした方が、コンピュータ資源を
無駄に使わなくてすむからです。
で、perlでバッファリングONの場合に
print と system などを混在させると、
print "abc";
system("echo def");
などとしても、"abcdef"という順番で出力されない
んです。abcがバッファに溜ったまま改行を待ち続ける
んで、"def\nabc"となってしまいます。
バッファリングをOFFにすると、改行がこなくても
とにかくabcを出力させることができます。
…というのが、僕がperlで $|=1; とする理由です。
もしかしたら他にも何か理由があるのかも。
出力がすぐにブラウザ側に渡るから、とか。
ken
1998/02/09(月) 00:44:09
[[解決]]
$|=1としない場合は、改行がくるまで出力待ち状態になるんですね。
ようやく意味がわかりました。
ご回答、ありがとうございました。
匿名希望
1998/03/05(木) 02:09:25
>出力がすぐにブラウザ側に渡るから
というのは違うと思います。
http等でバッファリングされるようです。
匿名希望
1998/03/05(木) 07:08:07
B-Cus
1998/03/07(土) 03:27:54
>> 出力がすぐにブラウザ側に渡るから
> というのは違うと思います。
> http等でバッファリングされるようです。
ところで、
print "Content-type: text/plain\n\n";
print "test1\n";
sleep 10;
print "test2\n";
をCGIで実行して、sleep 10が終了する前に
test1をブラウザ側に表示させる方法ってありますか?
とほほ
1998/03/07(土) 21:05:15
NNでは、以下の3つの条件を満たす場合に表示される・・・みたいです。
(1) print "test1<BR>\1"; のように<BR>を入れる。
(2) $| = 1; で出力をバッファリングしないようにする。
(3) NPHスクリプト(ファイル名をnph-*.cgi)にする。
でも、IEだと駄目だった。しくしく。
B-Cus
1998/03/08(日) 02:55:39
なるほどなるほど、、、、って、nphってなんでしたっけ(笑)
一度も使ったことなかったなぁ。調べてみよっと。
ちなみにtracerouteのCGIを置いているんですが、ゲートウェイを
ひとつたどっていくたびに即座に表示できないかな〜、と思って
質問させていただきました。
とほほ
1998/03/08(日) 13:04:18
CGIスクリプトのファイル名を nph- で始まる名前に変更するだけ
で、通常は[CGIスクリプト]→[WWWサーバ]→[WWWブラウザ]と経由す
るところを、[CGIスクリプト]→[WWWブラウザ]に直に返すことができ
るようになります。(未サポートのWWWサーバもあるかもしれないけど)
この方法で、tracerouteも1行ずつ表示できるんじゃないかなぁ。
B-Cus
1998/03/09(月) 02:07:39
いやどーもすいません。
うちで使えるかどうか早速調べてみます。
apacheなんで多分大丈夫だとは思いますが。
B-Cus
1998/03/10(火) 06:06:55
ダメでした。nphスクリプトは使えない設定になっているのか、
あるいはnphスクリプトというのは、cgiwrap経由だと使えないのか…
ところで、
> (1) print "test1<BR>\1"; のように<BR>を入れる。
この\1というのは\nのタイプミスですよね?
以下にスクリプト(エラー処理は省略)とURLをつけますので、
何か問題らしきものがありましたらご指摘ください。
-----------------------------
#!/usr/local/new/bin/perl
$|=1;
@input = split('&',$ENV{'QUERY_STRING'});
foreach (@input){
($key,$content) = split('=',$_);
$input{$key} = $content;
}
print "Content-type: text/html\n\n";
print "<html><body bgcolor=white>\n";
open(IN,"/usr/bin/traceroute $input{'domain'}|");
while (<IN>){
chop;
print "$_<br>\n";
}
close(IN);
print "</body></html>\n";
------------------------------
http://www.cs.gunma-u.ac.jp/cgi-bin/cgiwrap/~j5306050/nph-traceroute.cgi?domain=edu.cc.gunma-u.ac.jp
[上に]
[前に]
[次に]