使用Perl 6中的另一个数组的元素过滤数组的元素

时间:2017-10-25 13:32:23

标签: perl6

我想过滤以@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}} ...

的内容

3 个答案:

答案 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秒