我有两个数组@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 ...}
答案 0 :(得分:7)
在Perl中实现此目的的最简洁和惯用的方法不是通过使用“for”循环,而是map
和grep
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)
my %input0_map;
@input0_map{ @input0 } = ();
my @input = grep { exists $input0_map{$_} } @input1;
除非变量'tmp',否则不应将变量命名为'tmp'。由于此代码段未包含在大括号块中,因此我们不知道该大小有多大。
您不应该使用单个'undef'分配到哈希切片中,因为这意味着第一个元素被赋予该文字undef,而其他元素被赋予隐式undef。它会起作用,但它的风格很糟糕。要么为它们分配一个值,要么将它们全部分配给它们(如果我们从空列表中分配的话)。