Чтение одной строки из сокета домена Unix

У меня работает сервер socat с помощью этой команды:

socat ABSTRACT-LISTEN:test123 PIPE

Я могу открыть сокет для этого сервера, отправить одну строку, прочитать одну строку и распечатать его с помощью этого кода:

#!/usr/bin/perl

use strict;
use warnings;

use IO::Socket::UNIX;

my $sock = IO::Socket::UNIX->new(
    Type => SOCK_STREAM(),
    Peer => "\0test123"
) or die "Error creating socket: $!\n";

print $sock "Hello, world!\n";
my $line = <$sock>;
close $sock;

print $line;

Однако когда я заменяю последние 5 строк на следующие, программа зависает:

print <$sock>;

Разве не <FILEHANDLE> оператор должен прочитать одну строку из дескриптора? Почему я не могу прочитать одну строку и напечатать ее?

1 ответ

Решение

print <$sock> навязывает контекст списка для readline и, таким образом, читает и возвращает все строки до конца файла.

Как отмечено в perlop:

Если a используется в контексте, который ищет список, возвращается список, содержащий все строки ввода, по одной строке на элемент списка.

Как отметил Хакон-Хегланд в своем комментарии ниже, краткий способ прочитать только одну строку - наложить скалярный контекст:

print scalar <$sock>
Другие вопросы по тегам