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 }
}
}
}
I am using perl 5.30.0 on an Ubuntu 20.04 desktop. Appreciate any advice.
Smart matching is experimental and considered a failure. It should be avoided!
while (1) {
for ($SELECT->can_read ) {
if ( $_ == $AREC ) { }
elsif ( $_ == $IMU ) { }
elsif ( $_ == $STDIN ) { }
}
}
I like dispatch tables for these sorts of things, using the expected values as hash keys and the subroutine to run as the hash values. Some Perl pseudocode:
my $subs = (
SOME_AREC_VALUE => sub { ... },
SOME_IMU_VALUE => sub { ... },
SOME_STDIN_VALUE => sub { ... },
);
$subs->{$_}->();
I write quite a bit about replacing syntax structure with data structure in Mastering Perl and Effective Perl Programming.