如何找到一个数组中的哪些元素不在另一个数组中?

时间:2009-11-18 22:00:45

标签: perl

我是编程新手,因此我遇到了一个基本问题。

以下是我为了比较而编写的代码。但是我得到的结果对我来说没有意义。如果有人能告诉我出了什么问题,我将不胜感激。

有两个数组:@array1@array2长度不等。

我希望比较两个并列出@ array1中不存在的值。

my %temp = map {$_,$_}@array2;
for (@array1){
next if exists $temp{$_};
open (FILE, ">>/filename") or die "$!";
print FILE "$_\n";
close(FILE);
}

5 个答案:

答案 0 :(得分:10)

请参阅常见问题解答How do I compute the difference of two arrays? How do I compute the intersection of two arrays?

调整您发布的代码:

#!/usr/bin/perl

use strict; use warnings;

my @x = 1 .. 10;
my @y = grep { $_ % 2 } @x;

my %lookup = map { $_ => undef } @y;

for my $x ( @x ) {
    next if exists $lookup{$x};
    print "$x\n";
}

答案 1 :(得分:5)

如果您正在为测试做这个,我认为你是我会在新版本的测试中更强烈建议is_deeply:更多

您必须更新Test :: More

cpanp install Test::More

或者如果您使用的是perl 5.5

cpan Test::More

然后你就可以使用它了

use Test::More;
tests => 1
is_deeply ( \@arr1, \@arr2, 'test failed' );

如果你没有这样做进行测试,但你是为了内省目的这样做而且阵列很小,我建议使用XXX

cpanp install http://search.cpan.org/CPAN/authors/id/I/IN/INGY/XXX-0.12.tar.gz

然后你就可以使用它了

use XXX;
YYY [ \@arr1, \@arr2 ];

答案 2 :(得分:4)

这是你在那里的一些非常聪明的代码。您的代码或多或少与Perl FAQ所说的相同。然而,我可能会想要这样做:

my %tmp  = map  { $_ => 1 } @array2;
my @diff = grep { not exists $tmp{$_} } @array1;

这使得@array1中的所有内容都不在@array2中,但是避免了所有那些不合时宜的循环结构(对于函数式编程而言)。虽然我真的做的是:

sub comp (\@\@) {
  my %t = map { $_ => 1 } @{$_[1]};
  return grep { not exists $t{$_} } @{$_[0]};
}

然后你可以这样做:

my @diff = comp(@array1, @array2); # get items in @array1 not in @array2
@diff = comp(@arraty2, @array1); # vice versa

或者你可以去CPANList::Compare::Functional::complement()做你想要的,尽管语法是相反的。

答案 3 :(得分:1)

在代码中交换@array1@array2

答案 4 :(得分:0)

对于字符串或数字等简单值,以下内容应该有效

my @result;
my $hosts = [qw(host1 host2 host3 host4 host5)];
my $stie_obj = [qw(host1 host5 host6)];

@result = map { my $a=$_; my $b=grep {/$a/} @$site_obj; $b==0 ? $a : () } @$hosts;
print Dumper (@result);

应该给:

$VAR1 = 'host2';
$VAR2 = 'host3';
$VAR3 = 'host4';