我最初对此感到困惑:当我注意到这一点时,我正在研究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用于实现相同的目的是什么?
答案 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)*', $_;