我试图编写一个子例程,该例程将接收数组引用,然后删除该数组的某些元素。例如:
use strict;
use warnings;
my @a = (1, 2, 3, 6);
func1 (\@a);
sub func1 {
my $a = shift;
my @b = (2, 6);
for my $val_to_remove (@b) {
for my $i (0..$#$a) {
my $val = $a->[$i];
if ( $val == $val_to_remove ) {
splice @$a, $i, 1;
last;
}
}
}
}
至少可以说,使用两个for
循环似乎有点尴尬。有可能简化吗?
我也试过了
use strict;
use warnings;
my @a = (1, 2, 3, 6);
my $temp = \@a;
func2 (\$temp );
sub func2 {
my $a = shift;
$$a = [2, 6];
}
但是然后@a
没有被修改,而是$temp
会被..
我还希望避免将引用传递给引用,因为那样会使其他模块的调用语法混乱。
使用哈希作为指示符功能,可以有效地识别要删除的项目;使用grep过滤掉它们:
sub func1 {
my $a = shift;
my %b = map { ($_ => 1) } (2, 6);
@$a = grep { !$b{$_} } @$a;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句