Home > Software design >  Using given/when with IO::Select can_read
Using given/when with IO::Select can_read

Time:03-23

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.

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->{$_}->();
  • Related