加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl6:检查STDIN是否有数据

发布时间:2020-12-15 21:43:15 所属栏目:大数据 来源:网络整理
导读:在我的Perl 6脚本中,我想对标准输入进行(最好是非阻塞)检查以查看数据是否可用.如果是这种情况,那么我想处理它,否则我想做其他的事情. 示例(consumer.p6): #!/usr/bin/perl6use v6.b;use fatal;sub MAIN() returns UInt:D { while !$*IN.eof { if some_fanc
在我的Perl 6脚本中,我想对标准输入进行(最好是非阻塞)检查以查看数据是否可用.如果是这种情况,那么我想处理它,否则我想做其他的事情.

示例(consumer.p6):

#!/usr/bin/perl6
use v6.b;
use fatal;
sub MAIN() returns UInt:D {
    while !$*IN.eof {
        if some_fancy_check_for_STDIN() { #TODO: this needs to be done.
            for $*IN.lines -> $line {
                say "Process '$line'";
            }
        }
        say "Do something Else.";
    }
    say "I'm done.";
    return 0;
}

作为STDIN-Generator,我编写了另一个Perl6脚本(producer.p6):

#!/usr/bin/perl6
use v6.b;
use fatal;

sub MAIN() returns UInt:D {
    $*OUT.say("aaaa aaa");
    sleep-until now+2;

    $*OUT.say("nbbasdf");
    sleep-until now+2;

    $*OUT.say("xxxxx");
    sleep-until now+2;

    return 0;
}

如果consumer.p6按预期工作,它应该产生以下输出,如果通过./producer.p6 |调用./consumer.p6:

Process 'aaaa aaa'
Do something Else.
Process 'nbbasdf'
Do something Else.
Process 'xxxxx'
Do something Else.
I'm done.

但实际上,它会产生以下输出(如果if条件被注释掉):

Process 'aaaa aaa'
Process 'nbbasdf'
Process 'xxxxx'
Do something Else.
I'm done.

解决方法

您正在使用旧版本的Perl 6,因为v6.b是在该语言正式发布之前.
因此,我在下面的一些内容可能需要更新的版本才能工作.

另外你为什么要睡觉 – 直到现在2而不是睡2?

一种方法是将.lines转换为Channel,然后你可以使用.poll.

#!/usr/bin/env perl6
use v6.c;

sub MAIN () {
    # convert it into a Channel so we can poll it
    my $lines = $*IN.Supply.lines.Channel;

    my $running = True;
    $lines.closed.then: {$running = False}

    while $running {
        with $lines.poll() -> $line {
            say "Process '$line'";
        }
        say "Do something Else.";
        sleep ?;
    }
    say "I'm done.";
}

请注意,上面的代码目前在my $lines = …行阻止;因此,在第一行进入之前它不会开始做某事.为了解决这个问题,你可以做到以下几点

my $lines = supply {
    # unblock the $*IN.Supply.lines call
    whenever start $*IN.Supply {
        whenever .lines { .emit }
    }
}.Channel;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读