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



我正在尝试将字符串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 大于字符数,则生成的数组始终以一个空白元素结尾(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( 版本有误吗?
如果无法避免这种行为,我该如何实现我最初的目标?

文档中

的示例似乎不正确。 文档再往下看,如下所示:

另一方面,当 EXPR 末尾存在匹配项时,无论匹配的长度如何,都会生成一个空的尾随字段(当然,除非显式给出非零 LIMIT,否则将删除此类字段,如上一个示例所示(。

因为我提供了一个非零 LIMIT,所以尾随空字段被保留。 空模式//在最后一个字符之后但在字符串末尾之前匹配,因此正好生成一个尾随空字段。

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

最新更新