首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从数组中减去数组?

如何从数组中减去数组?
EN

Stack Overflow用户
提问于 2011-02-04 05:23:26
回答 6查看 16.1K关注 0票数 20

当我尝试以下操作时

代码语言:javascript
复制
#!/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

这是怎么回事?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-02-04 05:32:12

您需要将@bl转换为散列以执行设置的差值:

代码语言:javascript
复制
my %in_bl = map {$_ => 1} @bl;
my @diff  = grep {not $in_bl{$_}} @a;
票数 36
EN

Stack Overflow用户

发布于 2011-02-04 05:29:47

请参阅perlfaq4: How do I compute the difference of two arrays?

在您的代码中,not可能没有做您认为它正在做的事情。

如果not @bl为空数组,则@bl将始终为1;如果@bl不为空,则始终为undef。它在任何意义上都不意味着“元素不在@bl中”。

票数 4
EN

Stack Overflow用户

发布于 2011-02-04 05:36:22

grep的计算结果为true (它是一个元素数非零的数组),因此@b1构造(not @b1)中的布尔测试将始终返回false。grep过滤一个数组,只返回布尔测试返回true的元素。

您需要测试$_ (当前考虑的数组元素)是否在@bl中。一种方法是使用@bl作为键生成一个临时散列,然后在grep语句中检查散列键中是否存在$_

代码语言:javascript
复制
#!/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];
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4891898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档