• ベストアンサー

forkでプリント結果の違い

文末改行無しの動きがわかりません $pid = fork; if($pid){ Pid(1); wait; }else{ Pid(2); } sub Pid{ print"#$_[0]\n&"; #print"#$_[0]\n&\n"; }

質問者が選んだベストアンサー

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.2

自分の環境でprint "&";を実行した場合は、何も出力されないままPerlが終了しました。 Perlのprintはバッファリングを行っており、改行の時点でバッファリングされた文字列がまとめて出力されるようになっています。 https://mikeda.hatenablog.com/entry/20090427/1240846816 https://mikeda.hatenablog.com/entry/20090503/1241365884 print "#$_[0]\n&";を実行すると"#$_[0]\n"までの部分は"\n"によって出力されますが、その後の"&"はバッファリングされたままになります。その"&"が最終的に出力されるかどうかはタイミングなどに依存します(ひどい)。 バッファリングをやめてprint実行後すぐに出力されるように設定するには、予め$|=1;を実行します。上でリンクした2つ目の記事を参照。

その他の回答 (2)

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.3

補足です。 改行無しのprintは出力されないことがあって、forkやwaitとは関係ないということを示すのが回答No.1の意図でしたが、Perlの実行環境によっても挙動が異なるようですね。

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.1

forkも何も無しで、下記の2つの実行結果を見比べてみてください。 print "&\n"; print "&";

OK_WAVE
質問者

補足

回答者様のサンプルは当たり前の値が返ってきました 質問文のwaitをコメントにすると期待する値が返ってきます

関連するQ&A