答案 0 :(得分:25)
关于read
:
read
支持PerlIO图层。read
适用于任何Perl文件句柄 [1] 。read
缓冲区。read
以8 KiB [2] 的固定大小的块从系统获取数据。read
可能会阻止 [3] 。关于sysread
:
sysread
不支持PerlIO图层(意味着它需要原始的a.k.a.二进制句柄)。sysread
仅适用于映射到系统文件句柄/描述符 [4] 的Perl文件句柄。sysread
不会缓冲。sysread
执行单个系统调用。sysread
会立即返回,即使数据量小于请求的数量。总结和结论:
read
适用于任何Perl文件句柄,而sysread
仅限于映射到系统文件句柄/描述符的Perl文件句柄。read
与select
[5] 不兼容,而sysread
与select
兼容。read
可以为您执行解码,而sysread
则要求您自行解码。read
应该更快,而对于非常大的读取,sysread
应该更快。注意:
这些包括,例如,绑定文件句柄和使用open(my $fh, '<', \$var)
创建的句柄。
在5.14之前,Perl读入了4个KiB块。从5.14开始,在构建perl
时,可以配置块的大小,默认值为8 KiB。
根据我的经验,read
在从普通文件中读取时会准确返回请求的数量(如果可能),但从管道读取时可能会返回较少的数量。这些结果无法保证。
fileno
会为这些返回非负数。例如,这些包括从普通文件,管道和套接字读取的句柄,但不包括[1]中提到的句柄。
我指的是IO::Select调用的4个参数。