【问题标题】:How to get an unique element from two arrays in Perl如何从 Perl 中的两个数组中获取唯一元素
【发布时间】:2015-06-20 05:32:09
【问题描述】:

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

作为 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";

【问题讨论】:

  • 仅供参考,get_Lonlyget_unique 的别名,因此您应该只调用其中一个,而不是两个。
  • @ThisSuitisBlackNot 哎呀...我想我误读了get_Lonly 的别名引用。已更正!
  • 你确定grep 调用能达到你想要的效果吗?看起来您正在将 shell 样式模式与正则表达式工具混合使用。在我的系统(以及大多数 POSIXish 系统)上,grep '*.x86_64.rpm' 会查找带有文字星号的模式...
  • @pilcrow:嗯,我现在正在努力。我不得不将grep 调用更改为grep '.*x86_64.rpm'

标签: arrays perl


【解决方案1】:

@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;

【讨论】:

  • 并且@inst = join '.rpm', @inst 应该更改为s/$/.rpm/ for @inst 或类似的。
  • @ikegami 感谢您的帮助!我将不得不查一下chomp() 做了什么,因为我还没有遇到过。
  • 删除尾随的换行符
【解决方案2】:

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

#!/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?

【讨论】:

  • 我在想某种foreachif 声明。其他答案暗示了一些“神奇”的模式功能。我以为我误用或错过了一种模式。
  • 这是 O(N*M),一个非常糟糕的方法。可以在 O(N+M) 内完成
  • @ikegami 这是真的,但你的名单有多大?我意识到这是最好的情况=更糟,但除非你的名单很大.....
  • 即使对于 100 项的非常普通的列表,我们所说的比较也是 50 倍。 List::Compare 做对了,这是一个很好的选择,所以你的答案的全部要点是建议让代码变得更糟(因为它根本没有解决 OP 的问题!)
  • @ingueni "你的列表有多大" rpm -qa 返回系统上安装的所有 RPM 的列表。在我的机器上,这是 596 个结果。这只是 OP 的两个列表之一。
猜你喜欢
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2020-04-14
  • 2012-02-16
  • 2010-09-15
相关资源
最近更新 更多