准备哈希表以便高效地识别索引,然后使用它来索引原始数组。
my %ref_index;
@ref_index{ @ind_toss } = ();
@arr_filt = @arr_orig[ grep { !exists $ref_index{$_} } (0..$#arr_orig) ];
最终的@arr_filt
包含了除@ind_toss
以外的@arr_orig
中的元素。
请参考ysth在this post中提供的解决方案,以便通用地通过另一个数组过滤数组元素。
将它包装在一个子程序中并运行。要排除的索引数组为@ind_toss
,原始数组为@arr_orig
。
use warnings;
use strict;
my @ind_toss = (1, 4, 5);
my @arr_orig = ('a', '1', 'b', 'c', '2', '6', 'd', 'e');
my @filtered = @{ filter_array_by_index(\@arr_orig, \@ind_toss) };
print "@filtered" . "\n";
sub filter_array_by_index {
my ($rarr, $rind) = @_;
my %ref_index;
@ref_index{ @$rind } = ();
return [ @$rarr[grep { !exists $ref_index{$_} } (0..$#$rarr)] ];
}
打印
a b c d e
注释
如Oleg V. Volkov的评论中所示,子程序中的return
也可以写成:
return [ map { !exists $ref_index{$_} ? $rarr->[$_] : () } (0..$#$rarr) ];
这避免了通过
grep
和切片构建列表,而是有条件地索引到数组中。
0 .. (scalar(@{$x})-1)
更容易写成0 .. $#$x
,或者如果你喜欢的话是0 .. $#{$x}
。 - hobbs