What is the difference between `read` and `sysread`?
- read supports PerlIO layers.
- read works with any Perl file handle.
- read buffers.
- read obtains data from the system in fixed sized blocks of 8 KiB.
- read may block if less data than requested is available.
- 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.
- 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, while sysread is limited to Perl file handles mapped to a system file handle/descriptor.
- read isn't compatible with select, while sysread is compatible with select.
- read can perform decoding for you, while sysread requires that you do your own decoding.
- read should be faster for very small reads, while sysread should be faster for very large reads.
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 .
I'm referring to the 4-argument one called by IO::Select.