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