read and sysread have very similar documentation. What are the differences between the two?
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, while sysread is limited to Perl file handles mapped to a system file handle/descriptor.read isn't compatible with select[5], 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.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With