Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl如何知道从IO::Select::->can_read在句柄中读取多少字节?_Perl_Ipc - Fatal编程技术网

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

Perl如何知道从IO::Select::->can_read在句柄中读取多少字节?,perl,ipc,Perl,Ipc,我使用IO::Select的can_read方法来选择可以在简单的perl脚本中读取的文件句柄 但是,filehandles上的运算符不需要向其传递长度 是IO::选择到达文件句柄内部以设置适当的长度。。。或者到底发生了什么 #!/usr/bin/env perl use IO::Select; use strict; use warnings; my @handles = IO::Select->new(\*STDIN)->can_read(3); @handles == 1

我使用IO::Select的can_read方法来选择可以在简单的perl脚本中读取的文件句柄

但是,filehandles上的运算符不需要向其传递长度

是IO::选择到达文件句柄内部以设置适当的长度。。。或者到底发生了什么

#!/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");
然后,由于某种奇怪的原因,它会异常退出。。。不确定正在设置退出状态的位置


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

IO::Select不知道长度,运算符或readline函数也不知道长度。相反,它只会尝试读取那里的内容,直到行尾。如果未找到行尾字符,即$/它将在非阻塞文件句柄的情况下返回所有可用数据,或者在阻塞文件句柄的情况下等待行尾或数据结束


在你的特殊情况下,回声a;睡眠5;回显b产生一行a\n,5秒后产生一行b\n。因为您的代码在标量上下文中使用,所以它只读取一行。这意味着它将在找到第一行结尾后停止并返回该行,从而导致\n。

IO::Select和运算符或readline函数都不知道长度。相反,它只会尝试读取那里的内容,直到行尾。如果未找到行尾字符,即$/它将在非阻塞文件句柄的情况下返回所有可用数据,或者在阻塞文件句柄的情况下等待行尾或数据结束


在你的特殊情况下,回声a;睡眠5;回显b产生一行a\n,5秒后产生一行b\n。因为您的代码在标量上下文中使用,所以它只读取一行。这意味着它将在找到第一行结尾后停止并返回此行,从而生成\n.

哪个perl版本?在5.20上,它等待5秒并正常终止。在OS X上的perl 5.24。。。我怀疑tcsh错误地报告了退出状态:/can\u read uses select哪个perl版本?在5.20上,它等待5秒并正常终止。在OS X上的perl 5.24。。。我怀疑tcsh错误地报告了退出状态:/can_read也使用select,将缓冲I/O、readline和非缓冲I/O select、can_read、sysread混合在同一个句柄上是一个非常糟糕的主意。因此,使用select和IO::select包装器覆盖select。。。如何获取可以读取的文件句柄内容的长度。我认为sysread需要一个长度,因为它是read2上的一个薄包装。@GregoryNisbet:sysread中的length参数指定您最多要读取多少,而不是要读取多少。如果可用数据较少,sysread将返回这些数据,如果没有可用数据,sysread将阻塞,但也没有数据的结尾。@Gregory Nisbet,如果您从多个句柄读取,您的代码也将类似,混合缓冲I/O、readline和无缓冲I/O select,can_read,在同一个句柄上进行sysread是一个非常糟糕的主意。因此,使用select和IO::select wrappers over select。。。如何获取可以读取的文件句柄内容的长度。我认为sysread需要一个长度,因为它是read2上的一个薄包装。@GregoryNisbet:sysread中的length参数指定您最多要读取多少,而不是要读取多少。如果可用数据较少,sysread将返回这些数据,如果没有可用数据,sysread将阻塞这些数据,但也没有数据的结尾。@Gregory Nisbet,如果从多个句柄读取,则代码如下所示
% sh -c 'echo a; sleep 5; echo b' | perl reader.pl
I read a

Exit 141