当我尝试以下操作时
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @bl = qw(red green blue);
my @a = qw(green yellow purple blue pink);
print Dumper [grep {not @bl} @a];
我得到一个空数组。我原本以为@a
中减去了@bl
,所以输出结果是yellow purple pink
。
这是怎么回事?
发布于 2011-02-04 05:32:12
您需要将@bl
转换为散列以执行设置的差值:
my %in_bl = map {$_ => 1} @bl;
my @diff = grep {not $in_bl{$_}} @a;
发布于 2011-02-04 05:29:47
请参阅perlfaq4: How do I compute the difference of two arrays?
在您的代码中,not
可能没有做您认为它正在做的事情。
如果not @bl
为空数组,则@bl
将始终为1
;如果@bl
不为空,则始终为undef
。它在任何意义上都不意味着“元素不在@bl
中”。
发布于 2011-02-04 05:36:22
grep的计算结果为true (它是一个元素数非零的数组),因此@b1
构造(not @b1
)中的布尔测试将始终返回false。grep过滤一个数组,只返回布尔测试返回true的元素。
您需要测试$_
(当前考虑的数组元素)是否在@bl
中。一种方法是使用@bl
作为键生成一个临时散列,然后在grep语句中检查散列键中是否存在$_
:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @bl = qw(red green blue);
my @a = qw(green yellow purple blue pink);
# create a hash
my %h;
# nifty trick - use a hash slice to populate the
# hash. The values are irrelevant so we'll use @bl
# for those too
@h{@bl} = @bl;
print Dumper [grep {!exists $h{$_}} @a];
https://stackoverflow.com/questions/4891898
复制相似问题