字符串上的 Raku 范围运算符可以模仿 Perl 的行为吗?

Nik*_*nes 20 raku

在 Perl 中,表达式"aa" .. "bb"创建一个包含字符串的列表:

aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb
Run Code Online (Sandbox Code Playgroud)

然而,在 Raku 中(至少在 Rakudo v2021.08 中),相同的表达式创建:

aa ab ba bb
Run Code Online (Sandbox Code Playgroud)

更糟糕的是,"12" .. "23"在 Perl 中创建一个包含数字 12、13、14、15、...、23 的字符串列表,而在 Raku 中相同的表达式创建列表("12", "13", "22", "23")

文档似乎对这种行为保持沉默;至少,我在那里找不到解释。有什么方法可以得到 Raku 范围内的 Perl 行为吗?

(我知道第二个问题可以通过类型转换为 Int 来解决。但这不适用于第一个问题。)

cod*_*ons 17

可以通过使用带有自定义生成器的序列来获取 Perl 行为:

\n
say \'aa\', *.succ \xe2\x80\xa6 \'bb\';\n# OUTPUT: \xc2\xabaa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb\xc2\xbb\n\nsay \'12\', *.succ \xe2\x80\xa6 \'23\';\n# OUTPUT: \xc2\xab12 13 14 15 16 17 18 19 20 21 22 23\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n

(哦,这种情况的半解决方案\'12\'..\'23\':您已经注意到可以将端点转换为数字类型以获得所需的输出。但实际上您并不需要将两个端点转换为 \xe2\x80\x93 只是底部。所以12..\'23\'仍然会产生完整的输出。作为推论,因为^\'23\'是 的糖0..^\'23\',任何使用 &prefix:<^> 构建的范围都将是数字。)

\n

有关此行为背后的“原因”,请参阅我对此问题的另一个回答。

\n


rai*_*iph 15

TL;DR向端点字符串添加一个或多个额外字符。角色是什么并不重要。


当前的文档语料库由 Moritz Lenz++ 启动 10 年后,Raku 的文档一如既往地处于进展中。

这里有一座金矿,里面有超过 16 年的聊天记录,我有时会在其中进行探索,寻找答案。用 nick:搜索rangeTimToady“as Words” ,几分钟后我就得到了这个:

TimToady 相同长度的开头和结尾现在执行指定的语义

将每个位置视为一个单独的字符范围

我的即时反应:

  • 这就是它这样做的原因。设计 Perl 范围如何工作的人不仅故意指定它在 Raku 中的工作方式,而且于 2015 年亲自在 Rakudo 中实现了它。

  • 它做到了当且仅当“开头和结尾长度相同”。唔。

几秒钟后:

say flat "aa" .. "bb (like perl)";
say flat "12" .. "23 (like perl)";
Run Code Online (Sandbox Code Playgroud)

显示:

(aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb)
(12 13 14 15 16 17 18 19 20 21 22 23)
Run Code Online (Sandbox Code Playgroud)

  • 亲爱的@raiph - 这个“(像perl)”东西对我来说是新的,我在文档中找不到 - 请你能分享/指出它的一些定义吗? (2认同)