NAME
IO::BufferedSelect - Line-buffered select interface
SYNOPSIS
use IO::BufferedSelect;
my $bs = new BufferedSelect($fh1, $fh2);
while(1)
{
my @ready = $bs->read_line();
foreach(@ready)
{
my ($fh, $line) = @$_;
my $fh_name = ($fh == $fh1 ? "fh1" : "fh2");
print "$fh_name: $line";
}
}
DESCRIPTION
The select
system call (and the IO::Select
interface) allows us to process multiple streams simultaneously, blocking until one or more of them is ready for reading or writing. Unfortunately, this requires us to use sysread
and syswrite
rather than Perl's buffered I/O functions. In the case of reading, there are two issues with combining select
with readline
: (1) select
might block but the data we want is already in Perl's input buffer, ready to be slurped in by readline
; and (2) select
might indicate that data is available, but readline
will block because there isn't a full $/
-terminated line available.
The purpose of this module is to implement a buffered version of the select
interface that operates on lines, rather than characters. Given a set of filehandles, it will block until a full line is available on one or more of them.
Note that this module is currently limited, in that (1) it only does select
for readability, not writability or exceptions; and (2) it does not support arbitrary line separators ($/
): lines must be delimited by newlines.
CONSTRUCTOR
- new ( HANDLES )
-
Create a
BufferedSelect
object for a set of filehandles. Note that because this class buffers input from these filehandles internally, you should only use theBufferedSelect
object for reading from them (you shouldn't read from them directly or pass them to other BufferedSelect instances).
METHODS
- read_line
- read_line ($timeout)
- read_line ($timeout, @handles)
-
Block until a line is available on one of the filehandles. If
$timeout
isundef
, it blocks indefinitely; otherwise, it returns after at most$timeout
seconds.If
@handles
is specified, then only these filehandles will be considered; otherwise, it will use all filehandles passed to the constructor.Returns a list of pairs
[$fh, $line]
, where$fh
is a filehandle and$line
is the line that was read (including the newline, alareadline
). If the filehandle reached EOF, then$line
will be undef. Note that "reached EOF" is to be interpreted in the buffered sense: if a filehandle is at EOF but there are newline-terminated lines inBufferedSelect
's buffer,read_line
will continue to return lines until the buffer is empty.
SEE ALSO
AUTHOR
Antal Novak, <afn@cpan.org>
COPYRIGHT AND LICENSE
Copyright (C) 2007 by Antal Novak
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.