我想过滤以以下元素@array开头的元素@search:
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
.put for @array .grep: /^ @search /;
Run Code Online (Sandbox Code Playgroud)
问题是需要19秒.所以,我"预编译"的regex对grep,整个程序是这样的:
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
my $search = "/@search.join('|')/".EVAL;
.put for @array .grep: * ~~ /^ <$search> /;
Run Code Online (Sandbox Code Playgroud)
现在需要0.444秒.
问题:是否有内置的Perl 6方法来做这些事情?像插入junction一个regex......
您可以尝试通过组装正则表达式来加快速度。
我不确定如何使用纯 Perl 6执行此操作,但Regexp::AssemblePerl 5模块可以为 Perl 5正则表达式执行此操作。您可以在 Perl 6代码中使用 Perl 5模块,方法是将 a (前面不带空格)附加到语句中,然后访问其导出的符号(类、对象、例程等),就像它是 Perl 6模块一样::from<Perl5>use
use v6;
use Regexp::Assemble:from<Perl5>;
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
my $ra = Regexp::Assemble.new;
$ra.add( @search );
$ra.anchor_string_begin(1);
.put for @array.grep({so($ra.match( $_ ))});
Run Code Online (Sandbox Code Playgroud)