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

时间:2016-11-16 15:55:24

标签: arrays perl

我正在尝试将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)错了吗? 如果无法避免这种行为,我该如何实现我的最初目标呢?

1 个答案:

答案 0 :(得分:7)

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

  

空尾随字段,另一方面,当EXPR结束时匹配时会产生,无论匹配的长度如何(当然,除非明确给出非零LIMIT,否则删除这些字段,如上例所示。

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

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