my ($r_ready, $w_ready) = IO::Select::select($r_sel, $w_sel); foreach my $sock (@$r_ready) { # Create alias to the appropriate buffer. our $buf; local *buf = \$in_bufs{$sock}; my $rv = sysread($sock, $buf, 4096, length($buf)); # Read error. if (not defined $rv) { $r_sel->remove($sock); # ... Handle error socket ... next; } # Socket EOF if (not $rv) { $r_sel->remove($sock); # ... Handle closed socket ... next; } for (;;) { # Search for a complete command. my $pos = index($buf, "\x0A"); last if $pos < 0; my $cmd = substr($buf, 0, $pos+1, ''); # ... process $cmd ... } } foreach my $sock (@$w_ready) { # ... }