我是编程新手,因此我遇到了一个基本问题。
以下是我为了比较而编写的代码。但是我得到的结果对我来说没有意义。如果有人能告诉我出了什么问题,我将不胜感激。
有两个数组:@array1
,@array2
长度不等。
我希望比较两个并列出@ array1中不存在的值。
my %temp = map {$_,$_}@array2;
for (@array1){
next if exists $temp{$_};
open (FILE, ">>/filename") or die "$!";
print FILE "$_\n";
close(FILE);
}
答案 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
或者你可以去CPAN。 List::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';