拆分重叠 [RAKU]

jak*_*kar 7 split raku

当我试图解析一个多行字符串(用制表符分隔的字符串)以查找由制表符分隔的所有值时,我偶然发现了一个“奇怪”的行为,使用连续的两个分割:

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;
Run Code Online (Sandbox Code Playgroud)

对应的打印输出如下:

("L1:C1", "L1:C2", "L1:C3 L2:C1", "L2:C2", "L2:C3 L3:C1", "L3:C2", "L3:C3").Seq
Run Code Online (Sandbox Code Playgroud)

“奇怪”的行为出现在结果序列的第 3 和第 5 个成员中。似乎一行的“预期”最后一个字符串和后续行的第一个字符串有重叠。

我的期望是这样的:

("L1:C1", "L1:C2", "L1:C3", "L2:C1", "L2:C2", "L2:C3", "L3:C1", "L3:C2", "L3:C3").Seq
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细解释这种行为的内部运作?

为了澄清事情,我知道正确的代码是:

$s.split(/\n/)>>.split(/\t/).flat.raku
Run Code Online (Sandbox Code Playgroud)

但我的问题是关于“错误”代码的内部工作原理。Raku 是如何得出这个结果的?

jjm*_*elo 9

您正在拆分第一次拆分的结果,这是一个列表;split 方法会将其调用的任何内容强制转换为字符串,然后将其拆分。一个列表将(通过它的Str方法)字符串化为由单个空格分隔的成员。这就是为什么某些结果字段有两个 L 和 C 对并且中间有一个空格的原因。

这会让你得到你想要的结果:

say "L1:C1\tL1:C2\tL1:C3\nL2:C1\tL2:C2\tL2:C3\nL3:C1\tL3:C2\tL3:C3"
    .split("\n")
    .map( *.split( "\t" ).Slip )
Run Code Online (Sandbox Code Playgroud)

因为它拆分了第一个拆分的结果,然后将其转换为Slip以将其滑入更广泛的数组中。

  • 另外: `$s.split(/\n/)` 可能更好地写成 `$s.lines` (7认同)