Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List perl6(模式)*返回的列表与m:global/(模式)/返回的列表有何不同?_List_Match_Global_Raku - Fatal编程技术网

List perl6(模式)*返回的列表与m:global/(模式)/返回的列表有何不同?

List perl6(模式)*返回的列表与m:global/(模式)/返回的列表有何不同?,list,match,global,raku,List,Match,Global,Raku,Perl6在使用(pattern)*或(pattern)+捕获时返回一个列表,我会想象在使用:g副词时会发生类似的情况。但是,使用这两种方法返回的列表并不相同。这些文件没有提供更多细节。是否有其他来源可以找到更多信息 以下是一个例子: To exit type 'exit' or '^D' > my $a = "bananananananana"; bananananananana > my $m = ($a ~~ m/ (an)+ /) 「ananananananan」 0 =&

Perl6在使用(pattern)*或(pattern)+捕获时返回一个列表,我会想象在使用:g副词时会发生类似的情况。但是,使用这两种方法返回的列表并不相同。这些文件没有提供更多细节。是否有其他来源可以找到更多信息

以下是一个例子:

To exit type 'exit' or '^D'
> my $a = "bananananananana";
bananananananana
> my $m = ($a ~~ m/ (an)+ /)
「ananananananan」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
> say $m[0]
[「an」 「an」 「an」 「an」 「an」 「an」 「an」]
> say $m[0][0]
「an」
> say $m[0][2]
「an」
> my $m = ($a ~~ m:g/ (an)+ /)
(「ananananananan」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」)
> say $m[0];
「ananananananan」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
> say $m[0][1]
Nil
> say $m[0][0]
[「an」 「an」 「an」 「an」 「an」 「an」 「an」]
> say $m[0][0][1]
「an」
> my $n = ($a ~~ m:g/ (an) /)
(「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」)
> say $n[0]
「an」
 0 => 「an」
> say $n[0][0]
「an」
> 

导致这些不同输出的规则包括:

  • m/
    匹配正则表达式一次,如果匹配成功,则返回
    Match
    对象;如果未成功,则返回
    Nil
  • m:g/
    根据匹配的频率重复匹配正则表达式,并返回零个或多个
    Match
    对象的
    列表
  • 正则表达式中的
    ()
    导致一个位置捕获,它本身就是一个
    匹配对象
  • 正则表达式中的
    ()*
    导致一个位置捕获,这是一个包含零个或多个
    匹配对象的
    列表
  • 正则表达式中的
    ()+
    导致一个位置捕获,它是一个或多个
    匹配对象的
    列表
  • 在父对象
    匹配
    对象上使用
    []
    或作为
    $0
    $1
    $2
    提供位置捕获
在你的例子中:

  • m/(an)+/
    返回匹配的
    「anananan
    ,它有一个位置捕获,是七个
    「an
    匹配的列表


  • m:g/an/
    返回七个不包含任何捕获的
    匹配项的列表


  • m:g/(an)/
    返回七个
    匹配项的列表,每个匹配项都有一个位置捕获,即
    匹配项

我认为您的困惑可能是由于
say
打印列表和匹配项摘要的方式造成的。
特别是对于最后一个示例,
say
将结果打印为:

(「an」
0=>,安
0=>,安
0=>,安
0=>,安
0=>,安
0=>,安
0=>(安)
…这实际上是七个
匹配对象的列表,每个对象都是

,安
0=>an

Aha!!!谢谢smls!!!语言的美妙味道和细微差别需要时间去品味和消化:-)谢谢!!!