Perl 基于两个条件删除阵列线
我有一个三维数组,如:Perl 基于两个条件删除阵列线,perl,Perl,我有一个三维数组,如: $a[0][0]=1; $a[0][1]=2; $a[0][2]=1; $a[1][0]=1; $a[1][1]=3; $a[1][2]=-1; $a[2][0]=2; $a[2][1]=4; $a[2][2]=1; 我想删除前两个元素值为1和3(在本例中为整个a[1][0..2]元素)的行。我想获得的输出是: $a[0][0]=1; $a[0][1]=2; $a[0][2]=1; $a[1][0]=2; $a[1]
$a[0][0]=1; $a[0][1]=2; $a[0][2]=1;
$a[1][0]=1; $a[1][1]=3; $a[1][2]=-1;
$a[2][0]=2; $a[2][1]=4; $a[2][2]=1;
我想删除前两个元素值为1和3(在本例中为整个a[1][0..2]元素)的行。我想获得的输出是:
$a[0][0]=1; $a[0][1]=2; $a[0][2]=1;
$a[1][0]=2; $a[1][1]=4; $a[1][2]=1;
我正在寻找这个问题的通用解决方案。有一个条件我会使用
grep
函数,但我不知道如何用两个条件来实现它。在Perl中没有2D数组。@a
只是一个引用数组。所以你不是想删除$a[1][0..2]
,而只是$a[1]
use Data::Dumper;
$a[0][0]=1; $a[0][1]=2; $a[0][2]=1;
$a[1][0]=1; $a[1][1]=3; $a[1][2]=-1;
$a[2][0]=2; $a[2][1]=4; $a[2][2]=1;
print Dumper(\@a);
@b=grep(!($_->[0]==1 && $_->[1]==3),@a);
print Dumper(\@b);
但是你不能真正从数组中删除。使用,你可以移动所有元素
for my $i (reverse 0 .. $#a) {
splice(@a, $i, 1) if $a[$i][0]==1 && $a[$i][1]==3;
}
但是,通常使用并将其余元素分配回数组来删除不需要的元素更简单、更有效
@a = grep { !( $_->[0]==1 && $_->[1]==3 ) } @a;
Perl中没有2D数组。
@a
只是一个引用数组。因此,您不想删除$a[1][0..2]
,而只是删除$a[1]
但是你不能真正从数组中删除。使用,你可以移动所有元素
for my $i (reverse 0 .. $#a) {
splice(@a, $i, 1) if $a[$i][0]==1 && $a[$i][1]==3;
}
但是,通常使用并将其余元素分配回数组来删除不需要的元素更简单、更有效
@a = grep { !( $_->[0]==1 && $_->[1]==3 ) } @a;