当我试图解析一个多行字符串(用制表符分隔的字符串)以查找由制表符分隔的所有值时,我偶然发现了一个“奇怪”的行为,使用连续的两个分割:
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 是如何得出这个结果的?
您正在拆分第一次拆分的结果,这是一个列表;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以将其滑入更广泛的数组中。
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |