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;