Сбой печати при использовании chomp () - PullRequest
3 голосов
/ 28 декабря 2011

Итак, у меня возникла эта проблема при цикле через сокет с циклом 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;
}

Итак, мой вопрос: как я могу перебрать сокет (перевод строки завершен), не добавляя в сообщения символы новой строки?

Спасибо большое!

1 Ответ

5 голосов
/ 28 декабря 2011

chomp сделан на копии $_, поэтому он вообще не должен влиять на дескриптор сокета.Скорее всего, удаление новой строки заставляет оператор print ждать в буфере и выполняться после завершения сценария.

Другими словами: это не ошибка, а просто задержка.

Попробуйте использовать autoflush для немедленного выполнения печати. ​​

$| = 1;
...