Perl中split分割含换行符字符串为何出现意外结果?
Perl中split按换行符分割的异常行为与解决办法
问题原因
Perl的split函数默认会自动丢弃分割结果末尾的空元素,这是其内置的行为逻辑,和分隔符是否是换行符无关。
比如:
- 当字符串以换行符结尾时(如
"A\nB\n"),最后一个换行符分割出的空元素会被忽略,所以结果只有("A","B") - 当字符串全是换行符时(如
"\n\n\n"),分割后所有元素都是空的,末尾的空元素被全部丢弃,最终得到空数组
解决方法
要强制保留所有空元素(包括末尾的),只需给split传入第三个参数-1。这个参数的作用是取消对返回元素个数的限制,同时强制保留所有分割产生的空元素,无论其位置在哪里。
修正后的示例
@fields = split /\n/, "\n\n\n", -1; # 得到4个空元素("", "", "", "") @fields = split /\n/, "A\nB\n", -1; # 得到3个元素("A","B","") @fields = split /\n/, "A\n\n", -1; # 得到3个元素("A","","") @fields = split /\n/, "\nB\nC", -1; # 结果不变,仍为("","B","C") @fields = split /\n/, "A\n\nC", -1; # 结果不变,仍为("A","","C") @fields = split /\n/, "A\nB\nC", -1; # 结果不变,仍为("A","B","C")
补充说明
这个行为是Perl split函数的标准特性,在你提到的Perl 5.34.0、5.30.3、5.22.1及5.18.2等版本中均保持一致,并非版本bug。
内容的提问来源于stack exchange,提问作者jammcq
相关产品推荐
相关产品推荐

