【问题标题】:Compare 2 arrays and remove matches比较 2 个数组并删除匹配项
【发布时间】:2012-03-14 14:24:24
【问题描述】:

我有 2 个数组 (@system,@reserve)。每个都包含一个数字列表,我想比较和拼接(也许?)@reserve 中的数字,它们与@system 中的数字匹配。

我已经尝试了一些响应来查找和拼接问题,但它们似乎不起作用。使用 Perl 5.12.4。

@reserve 中的数字将始终为 11000..136000,系统中的数字将始终在 @system 范围内,但会有所不同。我一直关注的代码如下:

my @system = query();
my @reserve = 11000..136000;

foreach my $num (@system) {
my $index = 0;
$index++ until $reserve[$index] eq $num;
splice (@reserve,$index,1);
}

query() 只是向系统 (PBX) 询问号码列表并将它们推送到@system

感谢任何帮助。

谢谢,

马蒂

【问题讨论】:

  • 虽然使用散列的键作为集合可以更好地解决这个问题,但在编程点上,您的内部循环可能很危险,因为如果$num 没有出现在@987654330 中,它可能会挂起@。此外,您的值似乎是数字,但您使用 string 相等运算符 eq 比较它们。

标签: perl array-splice


【解决方案1】:

当您使用 hashslice 时,您不必使用 splice

my @system = query();

my %reserve ;
@reserve{(11000..136000)} = undef ;

delete @reserve{@system} ;
my @list_of_reserve = sort { $a <=> $b } keys %reserve ;

【讨论】:

  • 虚幻。谢谢你。效果很好。
【解决方案2】:

怎么样:

my @system = query();
my @reserve = 11000..136000;
my %tmp = map{$_ => 1}@system;
@reserve = grep{!exists $tmp{$_}}@reserve;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多