Perl 如何知道要从 IO::Select::->can_read 的句柄中读取多少字节?
How does Perl know how many bytes to read in a handle from IO::Select::->can_read?
我正在使用 IO::Select
的 can_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
.
我正在使用 IO::Select
的 can_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
.