Perl多层grep嵌套$_冲突解决:筛选哈希中不在数组内的键
解决方法
核心思路是在外层grep的代码块里先把当前遍历的哈希键赋值给一个独立的词法变量,避免和内层grep的默认变量$_冲突,正确实现代码如下:
my @bad_args = grep { my $key = $_; not grep { $_ eq $key } @defined_args; } keys %args;
逻辑说明
- 外层grep遍历
%args的所有键,每次循环将当前键存入词法变量$key,这个变量在内层grep的作用域内依然可用 - 内层grep遍历
@defined_args,判断当前数组元素是否和外层传入的$key相等,只要存在至少一个匹配项,内层grep就会返回非空列表,布尔判断为真 - 外层
not会过滤掉存在匹配的键,最终只保留@defined_args中不存在的键存入@bad_args
补充说明
嵌套grep的实现时间复杂度为O(n*m),如果@defined_args元素量较大,更推荐先转成哈希查找的方案,性能会高很多:
my %defined_arg_map = map { $_ => 1 } @defined_args; my @bad_args = grep { !exists $defined_arg_map{$_} } keys %args;
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

