我正在尝试将split
字符串添加到其组成字符中
为此,我始终使用the documentation建议的split(//, $str)
:
但是,这个:
print join(':', split(//, 'abc')), "\n";
使用空字符串匹配作为分隔符来生成输出a:b:c
;因此,空字符串可用于将EXPR拆分为其组成字符列表。
在我的脚本中,我需要前N个字符的数组或第一个length($str) - 1
字符,以较少者为准。为此,我使用split(//, $str, $n + 1)
并丢弃最后一个元素。
理论上这应该有用。如果LIMIT小于字符串长度,则将所有额外字符分组到最后丢弃的元素中。如果LIMIT大于字符串长度,则最后一个元素是丢弃的最后一个字符。
这是我遇到一些问题的地方。
文档说:
......以及每一个:
print join(':', split(//, 'abc', 3)), "\n";
print join(':', split(//, 'abc', 4)), "\n";
生成输出a:b:c
。
但这不是我得到的结果。如果LIMIT大于字符数,则结果数组始终以完全一个空白元素(demo)结束:
print join(':', split(//, 'abc', 1)), "\n"; # abc
print join(':', split(//, 'abc', 2)), "\n"; # a:bc
print join(':', split(//, 'abc', 3)), "\n"; # a:b:c
print join(':', split(//, 'abc', 4)), "\n"; # a:b:c:
print join(':', split(//, 'abc', 99)), "\n"; # a:b:c:
这些结果与文档中的示例直接相矛盾。
文档错了吗?我的Perl版本(v5.22.2)错了吗? 如果无法避免这种行为,我该如何实现我的最初目标呢?
答案 0 :(得分:7)
看来文档中的示例不正确。文档的下面是以下内容:
空尾随字段,另一方面,当EXPR结束时匹配时会产生,无论匹配的长度如何(当然,除非明确给出非零LIMIT,否则删除这些字段,如上例所示。
因为我提供的是非零LIMIT,所以会保留尾随空字段。空模式//
在最后一个字符之后但在字符串结尾之前匹配,因此只产生一个尾随空字段。
评论中提出的变通方法 - 使用(?!$)
的分割模式或使用substr($str, 0, $n)
作为输入 - 都起作用。
但是,我没有强制split
合作,而是选择将“最终元素”逻辑从pop(@arr)
更新为while (@arr && pop(@arr) eq "") { }
。