perl6 中的变量量词
Variable quantifier in perl6
假设我想匹配至少有 4 个字母的单词,(并将它们存储在一个数组中),我编写了以下正则表达式,效果很好:
if ( $text ~~ m:g/(\w ** 4..*)/ )
{
my @words = $/;
...
}
量词从 4 到无限
**4..*
现在,如果我尝试用标量 $min_length 替换 4。两者:
if ($text ~~ m:g/(\w ** $::min_length..*)/)
和:
if ($text ~~ m:g/(\w ** <$::min_length>..*)/)
导致编译出错:
量词不量化任何东西
有没有办法将标量用作量词?
当 **
量词的右侧不是数字或范围文字,而是任意 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;
输出:
quick
brown
jumps
over
lazy
我认为使用 .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)
如果将单词定义为空格之间的字符,甚至可以使用.words
方法:
say $text.words.grep(*.chars >= $min-length);
===============
(quick brown jumps over lazy dog.)
假设我想匹配至少有 4 个字母的单词,(并将它们存储在一个数组中),我编写了以下正则表达式,效果很好:
if ( $text ~~ m:g/(\w ** 4..*)/ )
{
my @words = $/;
...
}
量词从 4 到无限
**4..*
现在,如果我尝试用标量 $min_length 替换 4。两者:
if ($text ~~ m:g/(\w ** $::min_length..*)/)
和:
if ($text ~~ m:g/(\w ** <$::min_length>..*)/)
导致编译出错: 量词不量化任何东西
有没有办法将标量用作量词?
当 **
量词的右侧不是数字或范围文字,而是任意 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;
输出:
quick
brown
jumps
over
lazy
我认为使用 .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)
如果将单词定义为空格之间的字符,甚至可以使用.words
方法:
say $text.words.grep(*.chars >= $min-length);
===============
(quick brown jumps over lazy dog.)