String 在Perl中从拆分中筛选数组中的空字符串?

String 在Perl中从拆分中筛选数组中的空字符串?,string,perl,split,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") ); - -

我最初对此感到困惑:我正在用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
DB映射(打印(“-”,$”\n),拆分(/,“测试”);
-t
-e
-
-t
数据库映射(打印(“-”,$\”\n),拆分(/。/,“测试”);
数据库映射(打印(“-”、$”、“\n”)、拆分(/()/,“测试”);
-
-t
-
-e
-
-
-
-t
我已经知道了;但是我不清楚
/(.)/
正则表达式中的那些空字符串是从哪里来的,但是几句话之后,页面上说如果正则表达式有分组,那么生成的列表也包含分组中匹配的子字符串。。。因为$x的第一个字符与正则表达式匹配,所以split在列表前面加了一个空的初始元素。“所以,这是预期的行为。(尽管如此,我仍然不清楚为什么解组的点
/./
不起任何作用)

但是,我也在使用Python,并且遇到了类似的问题(拆分的结果是空字符串)——在那里我发现了一个
过滤器(无,列表)
函数,在本次调用中,它只是从列表中删除空字符串。在Perl中,用于实现相同目的的是什么?

的第一个参数定义了将要分析的列表中的项分隔开的内容。在最后两个代码段中,您告诉
拆分
任何字符都是有效的分隔符,因此
拆分
返回wh在输入字符之间:五个空字符串

>perl -E"say qq{<$_>} for split /./, 'test', -1;"
<>
<>
<>
<>
<>
或者使用更好的工具

my @chars = /(.)/s;
my @chars = unpack '(a)*', $_;
的第一个参数定义了要分析的列表项之间的分隔符。在最后两个代码段中,您告诉
split
任何字符都是有效分隔符,因此
split
返回输入字符之间的内容:五个空字符串

>perl -E"say qq{<$_>} for split /./, 'test', -1;"
<>
<>
<>
<>
<>
或者使用更好的工具

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

如果将
-1
传递给
split
的第三个参数,您将看到更好的图片。不赞成将
map
用作foreach循环。除了小的低效率外,它向读者承诺一件事,但做另一件事。(
打印“-$\n”表示split…;
)如果将
-1
传递给
split
的第三个参数,您将看到更好的图片。不赞成将
map
用作foreach循环。除了小的低效率外,它向读者承诺一件事,但做另一件事。(
打印“-$\n”表示split…;
)非常感谢,@ikegami-很抱歉接受的太晚;但是,如果原则上(使用不同的正则表达式)我得到了一个空字符串数组,我想过滤它,现在我会这样做吗(比如Python的
filter(None,list)
)?我听说过
@arr=grep{defined}@arr;
应该可以工作,但我只是尝试了一下,它仍然会留下空字符串……啊,通过以下途径找到它:它应该是
@arr=grep{not/^\s*$/}@arr;
-过滤掉空字符串。干杯!
grep{!length}@arr
非常感谢,@ikegami-很抱歉这么晚才接受;不过,如果原则上如此(使用不同的正则表达式)我得到了一个空字符串数组,我想过滤它,现在我会这样做吗(比如Python的
filter(None,list)
)?我听说
@arr=grep{defined}@arr;
应该可以工作,但我刚刚尝试过,它仍然会留下空字符串…啊,通过以下途径找到它:它应该是
@arr=grep{not/^\s*$}@arr;
-过滤空字符串。干杯!
grep{!length}@arr