Печать не выполняется при использовании гусеничка()


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

1 ответ:

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

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

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

$| = 1;