我正在尝试将字符串split
转换为其组成字符。
为此,我一直按照the documentation的建议使用split(//, $str)
:
在我的脚本中,我需要前N个字符或前length($str) - 1
个字符的数组,以较小者为准。为此,我使用split(//, $str, $n + 1)
并丢弃最后一个元素。
从理论上讲,这应该起作用。如果LIMIT小于字符串长度,则所有多余的字符将被分组到最后一个被丢弃的元素中。如果LIMIT大于字符串长度,则最后一个元素是被丢弃的最后一个字符。
这是我遇到问题的地方。
该文档说:
但这不是我得到的结果。如果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)版本错误吗?
如果无法避免这种行为,我该如何实现最初的目标?
最佳答案
看来文档中的示例不正确。以下是文档的一些内容:
由于我提供的是非零LIMIT,因此保留了尾随的空白字段。空模式//
在最后一个字符之后但在字符串末尾之前匹配,因此恰好产生一个尾随的空字段。
注释中建议的解决方法(使用(?!$)
的拆分模式或使用substr($str, 0, $n)
作为输入)均有效。
但是,我没有强制split
合作,而是选择了将“放弃最终元素”逻辑从pop(@arr)
更新为while (@arr && pop(@arr) eq "") { }
。