I am concocting a DIY sleep study filter that will log events from input from an audio stream (2K bytes/sec), an accelerometer (10 readings/sec) and console terminal keystrokes.
I have put together this chunk of code:
$SELECT=IO::Select->new or die "muffed create SELECT: $!\n" ;
my $i ; foreach ($AREC,$IMU,$STDIN) {
$i ;
$SELECT->add($_) or die "muffed SELECT $i: $!\n" ;
}
while (TRUE) {
foreach ($SELECT->can_read ) {
given ($_) {
when ($AREC) {}# handle audio from pipe
when ($IMU) {}# handle acceleromter from UDP socket}
when ($STDIN) {}# handle keystrokes }
}
}
}
- All of the given/when examples use string values or regular expressions. Will this work with filehandles?
- I recall that slower devices should have greater priority to avoid getting drowned in the flood of data input from faster devices. How should this be handled using IO::Select add and can_read?
I am using perl 5.30.0 on an Ubuntu 20.04 desktop. Appreciate any advice.
CodePudding user response:
Smart matching is experimental and considered a failure. It should be avoided!
while (1) {
for ($SELECT->can_read ) {
if ( $_ == $AREC ) { }
elsif ( $_ == $IMU ) { }
elsif ( $_ == $STDIN ) { }
}
}
CodePudding user response:
I like dispatch tables for these sorts of things:
my $subs = (
$AREC => sub { ... },
$IMU => sub { ... },
$STDIN => sub { ... },
);
$subs->{$_}->();