gpt4 book ai didi

arrays - Perl 6 中正则表达式中 <> 和匿名数组的特殊含义

转载 作者:行者123 更新时间:2023-12-03 21:26:58 25 4
gpt4 key购买 nike

在正则表达式之外,<> 的行为或多或少类似于单引号。我的浅薄理解似乎告诉我,在正则表达式中,<> 允许对代码进行评估和插值:

# Outside regex, <> acts like single quotes:
> my $x = <{"one"}>
{"one"}
> $x.WHAT
(Str)

# Inside regex, <> evaluates and interpolates:
> my $b="one";
one
> say "zonez" ~~ m/ <{$b}> / # Evaluates {$b} then quotes: m/ one /
「one」
> say "zonez" ~~ m/ <$b> / # Interpolates and quotes without {}
「one」

因为正则表达式中允许使用数组变量,所以我怀疑 Perl 6 正则表达式引擎在数组周围有 <> 内部正则表达式时将数组扩展为 OR。

我还怀疑在用户定义的字符类<[]>中,<>中的数组[]或多或少像匿名数组一样工作,类似于下面的@a,数组的内容(字符类中的字符)扩展为 OR。

my @a = $b, "two";
[one two]
> so "zonez" ~~ m/ @a /;
True
> say "ztwoz" ~~ m/ <{[$b, "two"]}> / # {} to eval array, then <> quotes
「two」
> say "ztwoz" ~~ m/ <{@a}> /
「two」
> say "ztwoz" ~~ m/ <@a> /
「two」
> say "ztwoz" ~~ m/ one || two / # expands @a into ORs: [||] @a;
# [||] is a reduction operator;
「two」

和char类扩展:

> say "ztwoz" ~~ m/ <[onetw]> / # like [||] [<o n e t w>];
「t」
> say "ztwoz" ~~ m/ o|n|e|t|w /
「t」
> my @m = < o n e t w >
[o n e t w]
> say "ztwoz" ~~ m/ @m /
「t」

Rakudo源码我没看过,理解有限。我无法在正则表达式中构造匿名数组来证明 <> 确实在正则表达式中构造数组。

那么,正则表达式中的 <> 有什么特别之处吗?或者我应该研究 Rakudo 源代码(我现在真的尽量不这样做)?

最佳答案

在正则表达式之外 <>就像qw<> , 即它在空格上引用和拆分。

say <a b    c>.perl;
# ("a", "b", "c")

可以展开为

q :w 'a b    c'

Q :q :w 'a b c'

Q :single :words 'a b c'

我推荐阅读 Language: Quoting Constructs因为这是一个比这里可以讨论的更广泛的话题。

这几乎与<>无关在正则表达式内部执行。

<>的使用在正则表达式中在基本 Perl 6 代码中没有用,并且 qw在正则表达式中不是那么有用。所以这些字符起着双重作用,主要是因为 ASCII 中非字母和非数字字符很少。唯一一次它表现得像qw是紧跟< 之后的字符是一个空白字符。


在正则表达式内部,它可以被认为是将一些代码注入(inject)到正则表达式中;有点像宏或函数调用。

/<{ split ';', 'a;b;c' }>/;
/ [ "a" | "b" | "c" ] /;

( 请注意 | 同时尝试所有交替,而 || 首先尝试最左边的一个,然后是下一个,等等。也就是说 || 基本上与 | 在 Perl 5 中的工作方式相同和 PCRE。)

/<:Ll - [abc]>/
/ [d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z] / # plus other lowercase letters
/ <@a> /
/ [ "one" | "two" ] /

请注意 / @a /也分解成相同的结构。

/ <?{ 1 > 0 }> /

# null regex always succeeds
/ [ '' ] /
/ <?{ 1 == 0 }> /

# try to match a character after the end of the string
# (can never succeed)
/ [ $ : . ] /

最后两个不太准确,但可能是一种有用的思考方式。


它也用于调用正则表达式“方法”。

grammar Foo {
token TOP { <alpha> } # calls Grammar.alpha and uses it at that point
}

如果你注意到我总是用 [] 包围替换因为它总是像一个独立的子表达式。

从技术上讲,这些都不是按照我展示的方式实现的,它只是一个更容易解释的理论模型。

关于arrays - Perl 6 中正则表达式中 <> 和匿名数组的特殊含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46229008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com