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

Eug*_*sky 6 perl6 raku

我想过滤以以下元素@array开头的元素@search:

my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
.put for @array .grep: /^ @search /;
Run Code Online (Sandbox Code Playgroud)

问题是需要19秒.所以,我"预编译"regexgrep,整个程序是这样的:

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......

Håk*_*and 3

您可以尝试通过组装正则表达式来加快速度。

我不确定如何使用纯 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)

  • @EugeneBarsky 我使用 [perlbrew](https://perlbrew.pl/)。按照 `Inline::Perl5` 的 [GitHub 页面](https://github.com/niner/Inline-Perl5) 上的说明安装可重定位的 `perl`。然后使用“perlbrew install-cpanm”为“perlbrew”安装“cpanm”,另请参阅 [metacpan.org](https://metacpan.org/pod/distribution/App-perlbrew/bin/perlbrew) 上的文档。然后使用 `cpanm Regexp::Assemble` 安装 Perl 5 模块 `Regexp::Assemble`。希望这会有所帮助! (2认同)