如何从Perl中的两个数组中获取唯一元素

时间:2015-06-19 17:43:13

标签: arrays perl

我试图获取第一个数组中唯一元素的列表。 (AKA:第一个数组中不在第二个数组中的元素。)但是我的脚本返回唯一元素的数字而不是每个元素中的信息。

作为Perl的新手,我知道这种语言有很多细微差别。我还没有看到我如何得到一个数字而不是一个元素列表。我所看到的唯一研究是如何获得一些独特的元素,显然,我已经发现了另一种方式。

感谢任何帮助。以下是代码。

#!/usr/bin/perl

use strict;
use warnings;
use v5.10;

use XML:Simple;
use LWP::Simple;
use List::Compare;

my @upd = system ("perl test.pl | grep '*.x86_64.rpm'");
my @inst = system ("rpm -qa");

@inst = join( '.rpm', @inst);

my $ls = List::Compare->new( {lists=> [\@upd, \@inst]} );
my @list = $ls->get_unique;
@list = $ls->get_Lonly;

say "@list";

2 个答案:

答案 0 :(得分:4)

@upd包含一个元素,即执行perl test.pl | grep '*.x86_64.rpm'的shell的退出状态。同样,@inst包含一个元素,退出状态为rpm。也许你试图捕获输出?使用反引号。

my @upd  = `perl test.pl | grep '*.x86_64.rpm'`;
chomp(@upd);

my @inst = `rpm -qa`;
chomp(@inst);

此外,以下内容不正确:

@inst = join( '.rpm', @inst);

应该替换为以下内容:

$_ .= '.rpm' for @inst;

答案 1 :(得分:-3)

遍历列表并检查每个元素与第二个列表中的每个元素,如果它不在整个第二个列表中,则将其推送(或做任何事情)到新数组

#!/usr/bin/perl

use strict;
use warnings;
use v5.10;
my @upd = ('cat', 'dog','mouse', 'fatcatsrul');
my @inst = ('cat', 'dog', 'mouse');
my @unique_elements_in_upd;
foreach(@upd)
{
    my $key= $_;
    if(!($key ~~@inst))
    {
        push(@unique_elements_in_upd, $key);
        print $key . "\n";
    }
}

输出:fatcatsrul

看看这个 http://perlmaven.com/smart-matching-in-perl-5.10

也查看这个比较 How fast is Perl's smartmatch operator when searching for a scalar in an array?