perl6中的变量量词

Mik*_*kel 7 regex perl6

假设我想匹配至少4个字母的单词,(并将它们存储在一个数组中),我写了以下正则表达式,它工作正常:

if ( $text ~~ m:g/(\w ** 4..*)/ )
{
  my @words = $/;
  ... 
}
Run Code Online (Sandbox Code Playgroud)

量词从4到无限

**4..*
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试用标量$ min_length替换4.都:

if ($text ~~ m:g/(\w ** $::min_length..*)/)
Run Code Online (Sandbox Code Playgroud)

和:

if ($text ~~ m:g/(\w ** <$::min_length>..*)/)
Run Code Online (Sandbox Code Playgroud)

在编译时导致错误:量词没有量化

有标量作为量词的方法吗?

Eli*_*sen 7

我认为使用.split更自然,同时.grep:

my $text = "The quick brown fox jumps over the lazy dog.";
my $min-length = 4;
say $text.split(/\W+/).grep(*.chars >= $min-length);
===============
(quick brown jumps over lazy)
Run Code Online (Sandbox Code Playgroud)

如果将单词定义为空格之间的字符,则甚至可以使用以下.words方法:

say $text.words.grep(*.chars >= $min-length);
===============
(quick brown jumps over lazy dog.)
Run Code Online (Sandbox Code Playgroud)


sml*_*mls 6

**量词的右侧不是数字或范围文字,而是任意Perl 6表达式时,您必须将其括在大括号中:

my $text = "The quick brown fox jumps over the lazy dog.";
my $min-length = 4;

my @words = $text.comb(/ \w ** {$min-length .. *} /);

.say for @words;
Run Code Online (Sandbox Code Playgroud)

输出:

quick
brown
jumps
over
lazy
Run Code Online (Sandbox Code Playgroud)