Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex perl6语法,不确定示例中的某些语法_Regex_Grammar_Raku - Fatal编程技术网

Regex perl6语法,不确定示例中的某些语法

Regex perl6语法,不确定示例中的某些语法,regex,grammar,raku,Regex,Grammar,Raku,我仍在学习perl6,我正在阅读本页的语法示例:;我已经多次阅读了regex上的文档,但是仍然有一些语法我不理解 token string { <quote> {} <quotebody($<quote>)> $<quote> } {}是一个空代码块。它是语法中的一个过程性(而不是声明性)元素。您可以将常规的Perl 6代码放在那里,让它做一些事情 在这种模式下,它正在做另一项工作。它提供了一个序列点,语法引擎知道它需要执行各种操作才能继续。这包

我仍在学习perl6,我正在阅读本页的语法示例:;我已经多次阅读了regex上的文档,但是仍然有一些语法我不理解

token string { <quote> {} <quotebody($<quote>)> $<quote> }

{}
是一个空代码块。它是语法中的一个过程性(而不是声明性)元素。您可以将常规的Perl 6代码放在那里,让它做一些事情

在这种模式下,它正在做另一项工作。它提供了一个序列点,语法引擎知道它需要执行各种操作才能继续。这包括填写捕获变量的值(例如
$
)。模式的下一部分需要确保
$
具有其值,因此它需要一些东西来确保该值可用

$
实际上是对匹配对象的单个元素访问。作为一个类似散列的东西,这实际上是
$/
,其中尖括号之间的东西是“键”。Perl 6喜欢有点聪明,因此它允许您省去
/
而获得
$
。其他匹配变量(如
$1
)也是类似的快捷方式

对于您的最后一个问题,查看您试图匹配的一些示例数据会有所帮助。Perl 6语法有许多特性来匹配平衡文本,这可能使任务变得微不足道。例如,请参见:

正则表达式中的
~
位于分隔符之间。结束定界符后面的东西是您期望的东西,
~
是:

> $s ~~ m/ '"' ~ '"' .+ /
「"Hello"」
您可以匹配开头的内容并捕获它(现在它位于
$0
),这样您就可以使用与结尾分隔符完全相同的内容:

> $s ~~ m/ (<["']>) ~ $0 .+ /
「"Hello"」
 0 => 「"」

$s~~m/(TL;DR@briandfoy已经提供了。但是这里有他没有提到的龙。还有漂亮的蝴蝶。这个答案很深刻

问题1:令牌中的
{}
在做什么

这是一个代码块1,2,3,4

它是空的,插入它纯粹是为了强制
quotebody($)
中的
$
求值为正则表达式开头的
捕获的值

没有插入代码块,
$
不包含正确值的原因是Rakudo Perl 6编译器的限制或与“匹配变量的发布”相关的错误

Rakudo“发布”匹配变量 Moritz Lenz指出,“正则表达式引擎不发布匹配变量,除非认为有必要”

“regex引擎”是指NQP中的regex/语法引擎,是Rakudo Perl 6编译器的一部分

“匹配变量”指存储匹配结果捕获的变量:

  • 当前匹配变量
    $/

  • 编号的子匹配变量
    $0
    $1

  • 命名的子匹配变量的形式为
    $

“发布”是指正则表达式/语法引擎尽其所能在正则表达式中提及任何变量(标记也是正则表达式)在给定的正则表达式中,匹配变量应该包含一个对应于在处理该正则表达式的任何给定阶段为其捕获的值,或者如果未捕获任何内容,则为
Nil

“认为必要”是指正则表达式/语法引擎在匹配过程中的每一步之后都会保守地询问是否值得进行发布工作我的意思是,引擎通常避免进行发布,因为它会减慢速度,而且通常是不必要的。不幸的是,它有时对何时真正需要发布过于乐观。因此程序员有时需要通过显式插入代码块来干预,以强制发布匹配变量(以及其他变量的其他技术5)。随着时间的推移,正则表达式/语法引擎可能会在这方面有所改进,从而减少需要手动干预的场景。如果您希望帮助实现这一点,请针对现有的相关bug创建对您有意义的测试用例。5

$
价值的“发布” 命名的capture
$
就是这里的例子

据我所知,当直接写入正则表达式时,所有子匹配变量都正确地引用了它们捕获的值,而不需要周围的构造。这是有效的:

my regex quote{
)。他的观点是匹配“nota quote”比“we not a quote?然后匹配任何字符”更容易理解

然而,当quote是一个变量,其值设置为捕获开始的quote时,这样做绝不是直接的。这种复杂性是由于Rakudo中的bug造成的。我已经找到了解决这些问题的最简单方法,但我认为最好还是坚持使用
,除非/直到这些长期存在的Rakudo错误已修复。5

token-escaped($quote){'\\'($quote |'\\')}我认为这是一个函数;

它是一个令牌,它是一个
Regex
,它是一个
方法
,它是一个:

say token{.}~~Regex;#True
说Regex~~Method;#True
说出方法~~常规;#正确
正则表达式(在本例中,代码是
标记{.}
中唯一的
,它是一个与单个字符匹配的正则表达式原子)的主体(
{…}
位)中的代码写在P6正则表达式“slang”中,而
方法
例程主体中使用的代码写在主P6“slang”中.4

使用
~
在这个问题所涉及的示例中,它是专门为解析而设计的。它读起来更好,因为它可以立即识别,并且可以将开头和结尾引号放在一起
 / '(' ~ ')' <expression> /
$ perl6
To exit type 'exit' or '^D'
> my $s = Q/abcdf "Hello" xyz/
abcdf "Hello" xyz
> $s ~~ m/ '"' ~ '"' .+ /
「"Hello"」
> $s ~~ m/ (<["']>) ~ $0 .+ /
「"Hello"」
 0 => 「"」