Perl如何一次性批量移除多个数组中的所有空白元素
Perl批量移除多个数组空白元素实现方案
问题背景
现有32个数组,需要移除所有数组中的空白元素,要求实现方式简洁,可通过单个foreach循环或1-2行命令完成。
原有尝试的代码无法生效:
my @refreshArrayList=("@list1", "@list2", "@list3","@list4", "@list5", "@list6" , "@list7"); foreach my $i (@refreshArrayList) { $i = grep (!/^\s*$/, $i); }
测试样例:
@list1 = ("abc","def","","ghi")@list2 = ("qwe","","rty","uy", "iop")
其余数组也存在同类空白元素,需要移除所有数组中的这类空白项。
期望输出:@list1 = ("abc","def","ghi")@list2 = ("qwe","rty","uy", "iop")
所有数组的空白元素都被清除。
原有代码失效原因
原有写法存在两个核心错误:
- 构造待处理列表时使用
"@list1"双引号包裹数组,会将整个数组拼接为单个字符串存入列表,没有关联原数组变量,后续修改完全不会影响原始的@list1、@list2等数组。 - 循环中
grep的调用方式错误,grep需要接收列表作为参数,传入单个标量$i时只会返回匹配成功的计数(0或1),无法得到过滤后的数组内容。
正确实现
方案1:通用正则匹配(过滤空串、全空白字符元素)
通过数组引用直接操作原数组,单个循环即可处理全部数组,仅需把32个数组全部补入待处理列表即可:
for my $array (\@list1, \@list2, \@list3, \@list4, \@list5, \@list6, \@list7 # 剩余数组直接向后追加 ) { @$array = grep { !/^\s*$/ } @$array; }
逻辑说明:\@list1是获取对应数组的引用,循环内@$array直接指向原数组的内容,grep会过滤掉所有匹配/^\s*$/(空串、全为空格/制表符等空白字符的元素)的项,赋值回原数组即完成修改。
方案2:极简单行写法(仅过滤空串)
如果需要移除的只有""类型的空串,不需要过滤全空格元素,可以用长度判断简化为一行:
@$_ = grep { length } @$_ for (\@list1, \@list2, \@list3 # 剩余数组直接向后追加);
该写法利用length对空串返回false的特性过滤空元素,执行效率比正则匹配更高。
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

