arrays - 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\"}"
这没有输出。知道会发生什么吗?
解决方案
正如@MattJacob 指出的那样,有两种相互冲突的用途$_
:
foreach (@del) {...}
这隐含地$_
用作循环变量。来自foreach文档:
foreach 关键字实际上是 for 关键字的同义词,因此您可以使用其中任何一个。如果省略 VAR,则将 $_ 设置为每个值。
您的grep
命令还使用$_
, always作为其处理的一部分。所以如果你有一个值$_
作为你的一部分foreach
,它在...中被替换了grep
?
从grep文档:
评估 LIST 的每个元素的 BLOCK 或 EXPR(将 $_ 本地设置为每个元素)
请检查 grep 文档,因为有关于修改您正在迭代的列表的明确警告。如果您尝试迭代地缩小列表,您可能会考虑一些替代方法来处理它。(例如,您能否构建一个模式来grep
组合@del
列表中的所有值,然后只处理@big
一次列表?这也可能更快。)
推荐阅读
- python - KeyError: 'mtD' when 'mtD' is nowhere to be found in the related code
- prolog - How to get a numeric value from the consulting file in Prolog?
- ruby-on-rails - ActiveRecord::StatementInvalid - PG::CharacterNotInRepertoire:错误:编码“UTF8”的字节序列无效
- node.js - 跳过express.js中多个选项路由参数的中间参数?
- ggplot2 - julia Plots 等效于 ggplot 的填充
- google-apps-script - 查找包含某些值的行号和列,然后将值插入该单元格
- ios - 快速无限滚动以加载以前的聊天记录
- python - 具有 NaN 值的 Python Dataframe 行式最小值和最大值
- mysql - Hadoop/Sqoop 通信链接错误 - 无法从 mysql 导入表
- google-cloud-armor - Cloud Armor WAF 上的详细 mod 安全规则