3

したがって、whileループでソケットをループしているときにこの問題が発生します。

これを使用すると、完全に正常に動作しますが、すべて$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を追加すると、クライアントを切断したときにのみループが終了しました(理由は理解しています)。私の推測では、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;
}

だから私の質問は次のとおりです。メッセージに改行を入れずにソケットをループする(改行で終了する)にはどうすればよいですか?

本当にありがとう!

4

1 に答える 1

5

はのchompコピー上に作成される$_ため、ソケット ハンドルにはまったく影響しません。多くの場合、改行を削除すると、印刷ステートメントがバッファー内で待機し、スクリプトが終了すると実行されます。

つまり、エラーではなく、ただの遅延です。

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

$| = 1;
于 2011-12-28T15:12:29.500 に答える