0

我最初对此感到困惑:当我注意到这一点时,我正在研究 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

我已经知道,如果使用空的正则表达式 // ,字符串会被分割成单独的字符;但我不清楚/(.)/正则表达式中的那些空字符串是从哪里来的——但仅仅几句话之后,页面就会指出“如果正则表达式有分组,那么生成的列表也包含来自分组的匹配子字符串.. . 由于 $x 的第一个字符与正则表达式匹配,因此 split 在列表中添加了一个空的初始元素。 “所以,这是预期的行为。(althgouh,我仍然不清楚为什么未分组的点/./不做任何事情)

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

4

1 回答 1

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)*', $_;
于 2013-04-11T15:20:39.820 回答