在 Supply 或其他类似流的序列上运行正则表达式?

Owe*_*wen 7 raku

假设我有SupplyChannelIO::Handle或类似的流式文本源,并且我想扫描它以查找与正则表达式匹配的子字符串。我无法确定匹配的子字符串不会交叉chunk boundaries。总长度可能是无限的,并且无法被放入内存中。

实现这一点的一种方法是,如果我可以实例化一个正则表达式匹配引擎,并在保持其状态的同时为其提供文本块。但我看不到任何方法可以做到这一点——我只看到运行匹配引擎完成的方法。

这可能吗?

Owe*_*wen 11

经过更多搜索后,我可能已经回答了我自己的问题。具体来说,它似乎Seq.comb能够组合块并延迟处理它们:

my $c = supply {
  whenever Supply.interval(1.0) -> $v {
    my $letter = do if ($v mod 2 == 0) { "a" } else { "b" };
    my $chunk = $letter x ($v + 1);
    say "Pushing {$chunk}";
    emit($chunk);
  }
};

my $c2 = $c.comb(/a+b+/);

react {
  whenever $c2 -> $v {
    say "Got {$v}";
  }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅用于构建此示例的并发功能。