【发布时间】:2017-09-04 03:54:10
【问题描述】:
my @r = split("", "hi");
say @r.elems;
--> output: 4
split 正在向数组中添加两个额外元素,一个在开头,另一个在结尾。
我必须在每次拆分后进行 shift 和 pop 来纠正这个问题。
有没有更好的分割字符串的方法?
【问题讨论】:
标签: raku
my @r = split("", "hi");
say @r.elems;
--> output: 4
split 正在向数组中添加两个额外元素,一个在开头,另一个在结尾。
我必须在每次拆分后进行 shift 和 pop 来纠正这个问题。
有没有更好的分割字符串的方法?
【问题讨论】:
标签: raku
如果您在空字符串上进行拆分,您将在返回列表的开头和结尾处获得一个空元素,因为在字符串之前和之后还有一个空字符串。
你想要的是.comb,不带参数,功能完整地写出来:
"hi".comb.elems.say; # 2
请参阅https://docs.raku.org/routine/comb#(Str)_routine_comb 了解更多信息。
【讨论】:
原因是当您使用空的 Str “” 作为分隔符时,它与您使用匹配字符旁边的正则表达式 /<|wb>/ 相同。所以它也在第一个字符之前和最后一个字符之后匹配。在这种情况下(并且仅在这种情况下),Perl 5 会为您删除这些“额外”字符串,这很可能是造成混淆的地方。
相反,Perl 6 允许您显式地 :skip-empty 值
'hi'.split('') :skip-empty
'hi'.split('', :skip-empty)
split("", "hi") :skip-empty
split("", "hi", :skip-empty)
或者指定你真正想要的东西
'hi'.comb( /./ )
'hi'.comb( 1 )
'hi'.comb
comb( /./, 'hi' )
comb( 1, 'hi' )
【讨论】: