使用split(//,$ str,$ limit)返回尾随空元素,与文档相矛盾

Mr.*_*ama 10 arrays perl

我正在尝试将split字符串放入其组件字符中.
为此,我总是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大于字符的数目越大,所得到的数组总是以结束恰好一个空白元件(演示):

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:
Run Code Online (Sandbox Code Playgroud)

这些结果与文档中的示例直接相矛盾.

文档错了吗?我的Perl版本(v5.22.2)错了吗?
如果无法避免这种行为,我该如何实现我的原始目标?

Mr.*_*ama 7

看来文档中的示例不正确.文档的下面是以下内容:

另一方面,当EXPR结束时匹配时产生空尾随字段,无论匹配的长度如何(当然,除非明确给出非零LIMIT,否则这些字段将被删除,如在最后一个例子中).

因为我提供非零LIMIT,所以保留尾随空字段.空模式//在最后一个字符之后但在字符串结尾之前匹配,因此恰好产生一个尾随空字段.

评论中提出的变通方法 - 使用分割模式(?!$)或使用substr($str, 0, $n)作为输入 - 都起作用.
但是,split我没有强制合作,而是选择将"丢弃最终元素"逻辑更新pop(@arr)while (@arr && pop(@arr) eq "") { }.