从Perl中的split中过滤数组中的空字符串?

时间:2013-04-11 15:16:44

标签: string perl split

我最初对此感到困惑:当我注意到这一点时,我正在研究Perl中的字符拆分功能:

  DB<56> map(print("-", $_, "\n"), split( //, "test")  );
-t
-e
-s
-t

  DB<57> map(print("-", $_, "\n"), split( /./, "test")  );

  DB<58> map(print("-", $_, "\n"), split( /(.)/, "test")  );
-
-t
-
-e
-
-s
-
-t

我已经知道if the empty regex // is used, the string is split into individual characters;但是我不清楚/(.)/正则表达式中的空字符串来自哪里 - 但只是几句后,页面说明“如果正则表达式有分组,则生成的列表包含匹配的来自分组的子串...由于$ x的第一个字符与正则表达式匹配,因此split将一个空的初始元素添加到列表中。“所以,它是预期的行为。 (althgouh,我还不清楚为什么未分组的点/./什么都不做)

但是,我也在使用Python,遇到了类似的问题(拆分结果中出现空字符串) - 在那里我发现了一个filter(None, list)函数,在这个调用中,它只是从列表中删除空字符串。 Perl用于实现相同的目的是什么?

1 个答案:

答案 0 :(得分:5)

split的第一个参数定义了分析您正在解析的列表的术语的内容。在最后两个片段中,您告诉split任何字符都是有效的分隔符,因此split返回输入字符之间的内容:五个空字符串。

>perl -E"say qq{<$_>} for split /./, 'test', -1;"
<>
<>
<>
<>
<>

(默认过滤掉空字符串。)

解决方案不是要开始过滤掉你要求split生成的东西。修复分隔符

my @chars = split /(?<=.)|(?=.)/s;
my @chars = split //;

或使用更好的工具

my @chars = /(.)/s;
my @chars = unpack '(a)*', $_;