从 Unix 域套接字读取一行

Reading one line from a Unix domain socket

我有一台服务器 运行 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 => "[=11=]test123"
) or die "Error creating socket: $!\n";

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

print $line;

然而,当我用以下内容替换最后 5 行时,程序挂起:

print <$sock>;

<FILEHANDLE> 运算符不是应该从句柄中读取一行吗?为什么我不能读一行并打印出来?

print <$sock> 将列表上下文强加给 readline,因此读取和 returns 所有行,直到文件结尾。

perlop 所述:

If a is used in a context that is looking for a list, a list comprising all input lines is returned, one line per list element.

正如 Hakon-Haegland 在下面的评论中指出的那样,一种只读一行的简洁方法是强加标量上下文:

print scalar <$sock>