首页 > 解决方案 > Perl - foreach 中的 grep 不适用于 $_ 但与变量一起使用

问题描述

我想从数组中删除一些已定义的元素。我已经有了一个解决方案,其中包含grep一个元素:@big = grep { ! /3/ } @big. 如果有几个元素,我想将它们放在一个数组中并使用 foreach。@big是我要从中删除元素的数组@del

perl -e "@big = (1,2,3,4,5); @del = (2,4); 
      foreach $i (@del) {@big = grep { ! /$i/ } @big; print \"@big\n\"}"

这是输出:

1 3 4 5
1 3 5

这对我来说很好。如果我想使用默认变量$_它不起作用:

perl -e "@big = (1,2,3,4,5); @del = (2,4); 
      foreach (@del) {@big = grep { ! /$_/ } @big; print \"@big\n\"}"

这没有输出。知道会发生什么吗?

标签: arraysperlforeachgrep

解决方案


正如@MattJacob 指出的那样,有两种相互冲突的用途$_

foreach (@del) {...}

这隐含地$_用作循环变量。来自foreach文档:

foreach 关键字实际上是 for 关键字的同义词,因此您可以使用其中任何一个。如果省略 VAR,则将 $_ 设置为每个值。

您的grep命令还使用$_, always作为其处理的一部分。所以如果你有一个值$_作为你的一部分foreach,它在...中被替换了grep

grep文档:

评估 LIST 的每个元素的 BLOCK 或 EXPR(将 $_ 本地设置为每个元素)

请检查 grep 文档,因为有关于修改您正在迭代的列表的明确警告。如果您尝试迭代地缩小列表,您可能会考虑一些替代方法来处理它。(例如,您能否构建一个模式来grep组合@del列表中的所有值,然后只处理@big一次列表?这也可能更快。)


推荐阅读