"$|=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

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