2013-12-30 2 views
0

У меня есть 3 dimendional массив, как:Удаление строки массива на основе двух условий

$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] элементы Выхода я хотел бы получить это:.

$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 условиями.

ответ

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
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); 
Смежные вопросы