Perl 如何知道要从 IO::Select::->can_read 的句柄中读取多少字节?

How does Perl know how many bytes to read in a handle from IO::Select::->can_read?

我正在使用 IO::Selectcan_read 方法来 select 准备好在简单的 perl 脚本中读取的文件句柄。

但是,文件句柄上的 <...> 运算符不需要传递给它的长度。

是否 IO::Select 到达文件句柄内部以设置 "appropriate length" ... 或者到底发生了什么?

#!/usr/bin/env perl
use IO::Select;
use strict;
use warnings;

my @handles = IO::Select->new(\*STDIN)->can_read(3);

@handles == 1 or die;

my $handle = $handles[0];

print ("I read " . <$handle> . "\n");

例如,以下脚本立即打印 "a\n",然后在三秒后退出。

% sh -c 'echo a; sleep 5; echo b' | perl reader.pl
I read a

Exit 141

然后由于一些奇怪的原因异常退出...不确定在何处设置退出状态。

编辑:明显的异常退出似乎是 tcsh 中的错误。

IO::Select 和 <...> 运算符或 readline 函数都不知道长度。相反,它只会尝试读取行尾之前的内容。如果未找到行尾字符(即 $/),在非阻塞文件句柄的情况下,它将简单地 return 所有可用数据,或者在阻塞的情况下等到行尾或数据结束文件句柄。

在您的特定情况下,echo a; sleep 5; echo b 生成一行 a\n,5 秒后生成一行 b\n。由于您的代码在标量上下文中使用 <..> 它只会读取一行。这意味着它将在找到第一行结尾和 return 这一行后停止,从而导致 a\n.