1

我有一个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>应该从句柄中读取一行吗?为什么我不能读取一行并打印它?

4

1 回答 1

2

print <$sock>正在将列表上下文强加到readline并因此读取并返回所有行,直到文件结束。

perlop中所述:

如果在查找列表的上下文中使用 a,则返回包含所有输入行的列表,每个列表元素一行。

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

print scalar <$sock>
于 2017-05-02T13:40:42.107 回答