Чтение одной строки из сокета домена 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>