2015-12-08 26 views
-1

对我来说,看起来perl split永远不会给出结果(""),即单个元素列表的单个元素是空字符串的单元素列表。无论如何 - 任何输入,对split的任何参数。任何人都可以显示吗?如果不是,这是一个功能还是错误?什么输入和参数将perl分裂给结果(“”),如果有的话?

我想split能够保持一致性,但很可惜:

注意分裂计算结果为空字符串总是 产生零个域,无论指定限制的EXPR。

http://perldoc.perl.org/functions/split.html

例如为:

$ echo ""|perl -ne 'chomp;print 0+split/x/,$_,-1' 
0 

$ echo "x"|perl -ne 'chomp;print 0+split/x/,$_,-1' 
2 

$ echo "xx"|perl -ne 'chomp;print 0+split/x/,$_,-1' 
3 

$ echo "xxx"|perl -ne 'chomp;print 0+split/x/,$_,-1' 
4 
+6

看起来像一个功能给我。你怎么能把一件事或多件事分开? –

+0

当'split'不能拆分时(无法在线上匹配正则表达式),Perl应该返回一个包含整个'$ _'的元素。当'$ _'为'“”'时,Perl打破了“承诺”,而是返回一个空列表。 –

+0

在Perl中,空字符串'“”'和空列表'()'表示相同的东西,这是错误的。 –

回答

-3

这是一个初步的答案我自己的问题,有待进一步的信息/修正该可能来自其他人:

perl split没有输入和参数,其结果将永远是包含空字符串的单元素列表。

为了得到与承诺一致的结果1)“结果的大小总是比分隔符的数量多1(正则表达式匹配)”和2)“如果没有分隔符,结果总是其元素是整个原始字符串”单元素列表,什么通常将一个干净的函数调用表达式

split /.../ 

代替需要被包裹如下,包括一个附加的辅助磁盘阵列:

@s = split /.../, $_, -1 or push @s, ""; 

然后@s通常应该在split /.../处使用。

例如为:

$ echo ""|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print [email protected]' 
1 

$ echo "x"|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print [email protected]' 
2 

$ echo "xx"|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print [email protected]' 
3 

$ echo "xxx"|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print [email protected]' 
4 

,或者可选地,使用任何代码裸split /.../和依托上述任一“用”的需要保护if (length) {...}length==0在单独的代码来处理的情况下的内部被投入。

+2

这看起来像ikegami的建议'长度($ _)的可读性较差的版本? split(...):“”'。 – ThisSuitIsBlackNot

+0

我认为ikegami不太清楚。对于'$ _'以外的输入,它也更加脆弱,要求为“长度”和“分割”插入该输入(并且因此表达式存在危险)。 '长度(<其他var>)? split /.../,,-1:“”;' –

5

如果没有,这是一个功能或一个错误?

不返回空字符串不是一个错误。根据文档,

请注意,将计算结果分割为空字符串的EXPR始终会生成零字段,而不管指定的LIMIT如何。


谁能否则说明了什么?

这是极不可能的,任何人都可以找到一个输入,当它的记录永远不会返回一个空字符串split返回一个空字符串。


这听起来像你想一个项目的列表时输入的是一个空字符串,所以

length($_) ? split(..., $_, -1) : "" 
相关问题