我想过滤以@array
@search
元素
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
.put for @array .grep: /^ @search /;
问题是需要19秒。所以,我regex
grep
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
my $search = "/@search.join('|')/".EVAL;
.put for @array .grep: * ~~ /^ <$search> /;
,整个程序看起来像这样:
junction
现在需要0.444秒。
问题:是否有内置的Perl 6方法来做这些事情?类似于将regex
插入{{1}} ...
答案 0 :(得分:3)
您可以尝试通过组合正则表达式加快速度。
我不知道如何使用纯Perl 6 执行此操作,但Regexp::Assemble
是Perl 5 模块,可以为Perl 5执行此操作正则表达式。您可以在Perl 6 代码中使用Perl 5 模块,方法是将:from<Perl5>
(没有前面的空格)附加到use
语句,然后访问它导出符号(类,对象,例程等),就像它是Perl 6 模块一样:
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( $_ ))});
答案 1 :(得分:3)
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
my $join = @search.join('|');
my $rx = rx{ ^ <{$join}> };
@array.grep( * ~~ $rx ).map( *.put )
您需要单独创建连接字符串,它将评估每个匹配的数组连接。但基本上可以在不使用EVAL的情况下为您提供所需的内容。
答案 2 :(得分:1)
对于此类搜索,您可以轻松使用wildcard table
say (@array X @search).grep( { defined($^a[0].index($^a[1])) } )
.grep( { $^a[0].index($^a[1]) == 0 } );
这将创建一个C列表,并在第一个元素中寻找该对的第二个元素;它只返回出现在第一个位置的列表。需要defined
,因为如果找不到它,它将返回Nil
。它并不比你上面的替代方案快,但是它在同一个球场,系统时间为0.03,大约0.30秒