perl - 从Unix域套接字读取一行

标签 perl sockets unix-socket perl-io

我有一个使用此命令运行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>运算符应该从句柄中读取一行?为什么我看不到一行并打印?

最佳答案

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

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>

关于perl - 从Unix域套接字读取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43738770/

相关文章:

node.js - Node IPC 错误 "Messages are large, You may want to consider smaller messages."

perl - 检测单个 CJK 字符

sockets - 我们可以在收到应用程序级别的确认后重置 TCP 连接吗?

python - 如何将文件从客户端发送到服务器并以相同的文件名保存?

sockets - 使用 golang 将 JSON 发送到 unix 套接字

ruby-on-rails - 如何初始化 Rack 服务器监听套接字

perl - 如何让 Perl 识别小写和大写输入?

perl - 加载模块时perl的包含路径中的搜索顺序是什么

perl - Perl 调试器为 $DB::sub 输出 "CODE(0x1431a90)"是什么意思?

php - 如何通过套接字在 PHP 和 C++ 应用程序之间进行通信?