将给定/当与 IO::Select can_read 一起使用

发布于 2025-01-16 06:15:02 字数 769 浏览 0 评论 0原文

我正在制作一个 DIY 睡眠研究过滤器,它将记录来自音频流(2K 字节/秒)、加速度计(10 读数/秒)和控制台终端按键输入的事件。

我已经将这段代码放在一起:

$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. 所有给定/当示例都使用字符串值或正则表达式。这适用于文件句柄吗?
  2. 我记得较慢的设备应该具有更高的优先级,以避免淹没在来自较快设备的大量数据输入中。应该如何使用 IO::Select add 和 can_read 处理这个问题?

我在 Ubuntu 20.04 桌面上使用 perl 5.30.0。感谢任何建议。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

秋凉 2025-01-23 06:15:02

智能匹配是实验并被认为是失败的。应该避免!

while (1) {
   for ($SELECT->can_read ) {
      if    ( $_ == $AREC  ) { }
      elsif ( $_ == $IMU   ) { }
      elsif ( $_ == $STDIN ) { }
   }
}

Smart matching is experimental and considered a failure. It should be avoided!

while (1) {
   for ($SELECT->can_read ) {
      if    ( $_ == $AREC  ) { }
      elsif ( $_ == $IMU   ) { }
      elsif ( $_ == $STDIN ) { }
   }
}
時窥 2025-01-23 06:15:02

我喜欢为这类事情使用调度表,使用预期值作为哈希键,并使用子例程作为哈希值运行。一些 Perl 伪代码:

my $subs = (
    SOME_AREC_VALUE  => sub { ... },
    SOME_IMU_VALUE   => sub { ... },
    SOME_STDIN_VALUE => sub { ... },
    );

$subs->{$_}->();

我在 Mastering Perl有效的 Perl 编程

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文