【发布时间】:2020-02-13 09:21:57
【问题描述】:
当我尝试解析多行字符串(使用制表符分隔的字符串)以查找所有由制表符分隔的值时,我偶然发现了一种“奇怪”的行为:
use v6.d; # 2020.01 release
my $s = "L1:C1\tL1:C2\tL1:C3\nL2:C1\tL2:C2\tL2:C3\nL3:C1\tL3:C2\tL3:C3";
say $s.split(/\n/).split(/\t/).raku;
对应的打印输出如下:
("L1:C1", "L1:C2", "L1:C3 L2:C1", "L2:C2", "L2:C3 L3:C1", "L3:C2", "L3:C3").Seq
“奇怪”行为出现在结果序列的第 3d 和第 5 个成员中。似乎某行“预期”的最后一个字符串和后续行的第一个字符串有重叠。
我的期望是这样的:
("L1:C1", "L1:C2", "L1:C3", "L2:C1", "L2:C2", "L2:C3", "L3:C1", "L3:C2", "L3:C3").Seq
有人详细解释这种行为的内部工作原理吗?
只是为了澄清一下,我知道正确的代码是:
$s.split(/\n/)>>.split(/\t/).flat.raku
但我的问题是关于“错误”代码的内部工作原理。 Raku 是如何得出这个结果的?
【问题讨论】:
-
如果您在文字上进行拆分,作为仅供参考,使用字符串进行拆分会在内部更快(或者至少以前是这样)(它不必采用正则表达式) :
$s.split("\n")».split("\t")或者,正如 lizmat 在 cmets 中提到的,$s.lines>>.split("\t")