【问题标题】:Variable quantifier in perl6perl6 中的变量量词
【发布时间】:2017-06-03 19:19:27
【问题描述】:

假设我想匹配至少有 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>..*)/)

导致编译出错: 量词不量化任何东西

有没有办法将标量用作量词?

【问题讨论】:

  • 错误信息很糟糕。如果你想帮助开发人员,请发送电子邮件至“rakudobug@perl.org”,主题类似于“[LTA]“量词不量化”消息,用于实际量化某些东西的代码,只是语法无效'和包含此问题的最小版本、您期望的消息类型以及 Rakudo 当前显示的实际错误消息的正文。 ('LTA',代表 Less Than Awesome,是 Perl 6 世界中用于表示不完美的错误消息的术语。这个错误消息离完美还有一百万英里!)
  • 谢谢。我会。错误消息有点神秘,是的,但至少它指向了正确的地方:)

标签: regex raku


【解决方案1】:

** 量词的右侧不是数字或范围文字,而是任意 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

【讨论】:

  • 在努力将其应用于 m// 时,您的解决方案运行良好,并且它为我节省了 if 语句和额外的赋值行。 -谢谢
  • @Mikkel 如果您需要if 声明,您也可以使用if $text.comb(/ …  /) -&gt; @words { … }if $text ~~ m:g/ …  / -&gt; @words { … }
【解决方案2】:

我认为使用.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.)

【讨论】:

  • $text.comb(/ \w+ /).grep(*.chars &gt;= $min-length); 也可以。对我来说,split 只在静态分隔符的情况下比comb 感觉更自然,否则它有点双重否定 - “给我所有单词”比“给我所有不属于的字段”更容易推理非词”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多