根据两个条件删除数组行

时间:2013-12-30 16:19:48

标签: perl

我有一个3维的数组,如:

$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的行(在本例中是整个[1] [0 .. 2]元素。我想获得的输出是:< / p>

$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函数,但我不知道如何用2个条件来做..

2 个答案:

答案 0 :(得分:3)

在Perl中没有2D数组这样的东西。 @a只是一组引用。因此,您不是要删除$a[1][0 .. 2],而只是$a[1]

但你无法真正从数组中删除。使用splice,您可以移动所有元素,

for my $i (reverse 0 .. $#a) {
   splice(@a, $i, 1) if $a[$i][0]==1 && $a[$i][1]==3;
}

但是使用grep删除不需要的元素并将其余元素分配回数组通常更简单,更有效。

@a = grep { !( $_->[0]==1 && $_->[1]==3 ) } @a;

答案 1 :(得分: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);