我正在尝试将字符串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 "") { }

10-05 20:46
查看更多