2011-12-28 13 views
3

したがって、whileループでソケットをループするときにこの問題が発生します。chomp()を使用すると印刷が失敗する

これを使用すると完全に正常に動作しますが、私には望ましくないすべての$messageに改行があります。

my $socket = new IO::Socket::INET (
    LocalHost => "127.0.0.1", 
    LocalPort => "12345", 
    Proto => 'tcp', 
    Listen => 1, 
    Reuse => 1 
); 
my $client = $socket->accept(); 
while(<$client>) { 
    my $message = $_; 
    print $message; 
} 

しかし、私は(私は理由を理解)クライアントを切断すると、ループが終わっのみムシャムシャ食べるを追加します。 私の推測では、chompは$_変数から改行を削除するので、ループはもはや機能しません。

my $socket = new IO::Socket::INET (
    LocalHost => "127.0.0.1", 
    LocalPort => "12345", 
    Proto => 'tcp', 
    Listen => 1, 
    Reuse => 1 
); 
my $client = $socket->accept(); 
while(<$client>) { 
    my $message = $_; 
    chomp($message); 
    print $message; 
} 

だから私の質問は:どのようにメッセージに改行をせずにソケットを通じ、私はループ(改行は終了)できますか?

ありがとうございました!

答えて

5

chomp$_のコピーで作成されているため、ソケットハンドルにはまったく影響しません。おそらく、改行の削除は、あなたのprintステートメントをバッファで待つようにし、スクリプトが終了すると実行します。

他の言葉:エラーではなく、ただ遅れているだけです。

autoflushを使用してすぐに印刷を実行してください。

$| = 1; 
+0

私が知ったことは、$ messageを印刷するときです。 "\ n"; が動作します。 これはこれに関連していますか? –

+0

答えをいただきありがとうございます。あなたのソリューションは機能しました。 Imは今や疑問に思っています。他のループと連携して処理しますか? –

+1

@JamieFlowers何かを 'print'すると、それはシェルのプリントバッファに送られます。このバッファは、改行が現れるまで実際には印刷されません。それは実際のエラーではなく、単に遅れです。 – TLP

関連する問題