About read
:
read
supports PerlIO layers.read
works with any Perl file handle[1].read
buffers.read
obtains data from the system in fixed sized blocks of 8 KiB[2].read
may block if less data than requested is available[3].
About sysread
:
sysread
doesn’t support PerlIO layers (meaning it requires a raw a.k.a. binary handle).sysread
only works with Perl file handles that map to a system file handle/descriptor[4].sysread
doesn’t buffer.sysread
performs a single system call.sysread
returns immediately if data is available to be returned, even if the amount of data is less than the amount requested.
Summary and conclusions:
read
works with any Perl file handle, whilesysread
is limited to Perl file handles mapped to a system file handle/descriptor.read
isn’t compatible withselect
[5], whilesysread
is compatible withselect
.read
can perform decoding for you, whilesysread
requires that you do your own decoding.read
should be faster for very small reads, whilesysread
should be faster for very large reads.
Notes:
-
These include, for example, tied file handles and those created using
open(my $fh, '<', \$var)
. -
Before 5.14, Perl read in 4 KiB blocks. Since 5.14, the size of the blocks is configurable when you build
perl
, with a default of 8 KiB. -
In my experience,
read
will return exactly the amount requested (if possible) when reading from a plain file, but may return less when reading from a pipe. These results are by no means guaranteed. -
fileno
returns a non-negative number for these. These include, for example, handles that read from plain files, from pipes and from sockets, but not those mentioned in [1]. -
I’m referring to the 4-argument one called by IO::Select.