使用Perl在数组中查找值

时间:2012-02-06 11:29:52

标签: arrays perl

我有两个数组@input0@input1。我希望for循环遍历@input1中的每个值,如果@input0中存在该值,则该值将保存在新数组@input中。

所有数组仅包含数字。每个数组元素最多有10个数字(见下文):

@input0 = {10061 10552 10553 10554 10555 10556 10557 10558 10559 10560, 10561 10562 10563 10564 10565 10566 10567 10573 10574 10575, ...}

@input1 = {20004 20182 ...}

4 个答案:

答案 0 :(得分:7)

在Perl中实现此目的的最简洁和惯用的方法不是通过使用“for”循环,而是mapgrep

my %seen0 = map { ($_ => 1) } @input0;
my @input = grep { $seen0{$_} } @input1;

如果您特别想要for循环,请解释为什么map / grep方法不起作用(除非它是一个作业,在这种情况下,问题应该标记为一个)

答案 1 :(得分:2)

短,甜又慢:

my @input = grep $_ ~~ @input0, @input1;

for循环的详细和更快:

my %input0 = map {$_, 1} @input0;
my @input;

for (@input1) {
    push @input, $_ if $input0{$_};
}

答案 2 :(得分:1)

你也可以使用hashslice + grep:

my %tmp ;
@tmp{@input0} = undef ; # Fill all elements of @input0 in hash with value undef
my @input = grep { exists $tmp{$_} } @input1 ; # grep for existing hash keys

答案 3 :(得分:0)

dgw的答案几乎就在那里,但包含了一些不是最佳实践的东西。我相信这更好:

my %input0_map;
@input0_map{ @input0 } = ();
my @input = grep { exists $input0_map{$_} } @input1;

除非变量'tmp',否则不应将变量命名为'tmp'。由于此代码段未包含在大括号块中,因此我们不知道该大小有多大。

您不应该使用单个'undef'分配到哈希切片中,因为这意味着第一个元素被赋予该文字undef,而其他元素被赋予隐式undef。它会起作用,但它的风格很糟糕。要么为它们分配一个值,要么将它们全部分配给它们(如果我们从空列表中分配的话)。