Using given/when with IO::Select can_read

Viewed 56

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 }
        }
    }           
}

  1. All of the given/when examples use string values or regular expressions. Will this work with filehandles?
  2. 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.

2 Answers

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.

Related