2010-11-04 3 views
1

У меня есть довольно большой массив, и я хочу удалить 2-й, 8-й, 14-й и т. Д. Элементы из массива. Мой массив в данный момент выглядит так:Как удалить элементы из массива Perl?

Element1 x A B C 
Element 2 y A B C 
Element 3 z A B C 

В целом, я хочу, чтобы удалить х, у и г (только в качестве примера, мой массив slighly более сложный). И вытащить остальное. Как и в, я не хочу иметь пустое место на своих позициях. Я хочу получить:

Element 1 A B C 
Element 2 A B C 
Element 3 A B C 

Я попытался дать этому попытку с моим массива «todelete»:

print "#Before Deleting"; print 
$todelete[0]; print "\n"; print 
$todelete[2]; print "\n"; print 
$todelete[3]; 

for ($count=2; $count<@todelete; 
$count=$count+6) { delete 
$todelete[$count]; } 

print "#After Deleting"; print 
$todelete[0]; print "\n"; print 
$todelete[2]; print "\n"; print 
$todelete[3];$todelete[3]; 

Но, в настоящее время, я думаю, что это просто unitializes свою ценность, потому что, когда Я печатаю результат, он говорит мне:

Use of uninitialized value in print 

Предложения?

ответ

5

Функция, которую вы хотите, это splice.

+0

Ваш удивительный! Большое спасибо! – poutine

+3

@poutine: кто-то потрясающий, потому что они прочитали [основную документацию, прилагаемую к каждой установке perl] (http://perldoc.perl.org/functions/splice.html)? Разве это не означает, что панель немного ниже? – Ether

+0

А ... но теперь у меня другая проблема, так как индекс сдвинут. Элемент, мне нужно удалить уже не на позиции 8. Его сейчас в позиции 7. Ах .. и то же самое для остальных. Я думаю, что лучшей альтернативой было бы просто удалить элемент, затем использовать фильтр, а затем объединить их. Эфир ... справа. На короткое мгновение, когда я подумал, что это сработало, я был поражен. Так как я потратил много времени, чтобы подумать об этом с точки зрения цикла for. – poutine

2

delete $array[$index] - это то же самое, что и звонок $array[$index] = undef; он оставляет пустое пространство в вашем массиве. Для вашей конкретной проблемы, как о чем-то вроде

@array = @array[ grep { $_ % 6 != 2 } 0 .. $#array ]; 
+0

'delete' on arrays устарел - еще одна веская причина не использовать его. – daotoad

2

Вы можете также использовать grep в качестве фильтра:

my $cnt = 0; @todelete = grep { ++$cnt % 6 != 2 } @todelete;

Смежные вопросы