【问题标题】:Accessing parts of match in Perl 6在 Perl 6 中访问部分匹配项
【发布时间】:2017-10-31 08:32:55
【问题描述】:

当我使用命名的正则表达式时,我可以打印它的内容:

my regex rgx { \w\w };
my $string = 'abcd';

$string ~~ / <rgx> /;
say $<rgx>; # 「ab」

但是如果我想和:g:ex副词匹配,那么匹配不止一个,就不行了。以下

my regex rgx { \w\w };
my $string = 'abcd';

$string ~~ m:g/ <rgx> /;
say $<rgx>; # incorrect

给出一个错误:

Type List does not support associative indexing.
  in block <unit> at test1.p6 line 5

我应该如何修改我的代码?

UPD:基于@piojo的explanation,我将最后一行修改如下,解决了我的问题:

say $/[$_]<rgx> for ^$/.elems;

以下会更容易,但由于某种原因它不起作用:

say $_<verb> for $/; # incorrect

【问题讨论】:

  • say $_&lt;verb&gt; for $/ 没有做你想做的事情的原因是使用$/ 字面意思将被解释为“只循环这里的一个东西”。如果您通过@$/$/.list$/ 重新上下文化为列表,您将获得所需的行为。 (一般来说,for $blah 会给你一个迭代。例外情况包括如果$blah 有一个Slip,或者如果你使用:= 运算符绑定了一个没有标量容器的值)
  • @timotimo 非常感谢!! @$/正是我需要的,非常好用!

标签: raku


【解决方案1】:

似乎:g:overlap 是特殊情况:如果您的匹配在正则表达式中重复,例如/ &lt;rgx&gt;* /,那么您将访问匹配为$&lt;rgx&gt;[0]$&lt;rgx&gt;[1] 等。但是在这种情况下,引擎不止一次地进行整个匹配。因此,您可以通过顶级匹配运算符$/ 访问这些匹配项。其实$&lt;foo&gt;只是$/&lt;foo&gt;的快捷方式。

所以根据错误信息,我们知道在这种情况下,$/ 是一个列表。所以我们可以通过$/[0]&lt;rgx&gt;$/[1]&lt;rgx&gt; 访问您的比赛。

【讨论】:

  • 啊,我明白了。所以$/&lt;rgx&gt; 分支“之前”被分成两个(匹配),所以我试图通过 $/ 访问它是没有意义的。 @piojo 感谢您的解释!
  • @EugeneBarsky 我不能说权威,但这就是我的看法。不客气!
  • 似乎即使只有一个匹配项,使用:ex 也会使$/ 成为一个列表(只有一个元素),所以我只能通过$/[0]&lt;rgx&gt; 访问&lt;rgx&gt;。跨度>
  • 那很好。一致性非常重要。如果不能静态地知道是以$foo&lt;x&gt; 还是$foo[$n]&lt;x&gt; 访问数据,就很难编写正确的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多