从Unix域套接字读取一行

时间:2017-05-02 13:09:26

标签: 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>运算符是否应该从句柄中读取一行?为什么我不能读一行并打印出来?

1 个答案:

答案 0 :(得分:1)

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

perlop中所述:

  

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

正如Hakon-Haegland在下面的评论中指出的那样,只读一行的简明方法是施加标量背景:

print scalar <$sock>