Обработка нескольких элементов массива

Проблема

Требуется удалить сразу несколько элементов в начале или конце массива.

Решение

Воспользуйтесь функцией splice:
# Удалить $N элементов с начала @ARRAY (shift $N)
@FRONT = splice(@ARRAY, 0, $N);
# Удалить $N элементов с конца массива (pop $N)
@END = splice(@ARRAY, -$N);

Комментарий

Часто бывает удобно оформить эти операции в виде функций:
sub shift2 (\(@) {
  return splice(@{$_[0]}, 0, 2);
}
sub pop2 (\(@) {
  return splice(@{$_[0]}, 0, -2);
}
Использование функций делает код более наглядным:
@friends = qw(Peter Раul Mary Jim Tim);
($this, $that) = shift2(@friends);
# $this содержит Peter, $that - Paul,
# a @friends – Mary, Jim и Tim

@beverages = qw(Dew Jolt Cola Sprite Fresca);
@pair = pop2(@beverages):
# $pair[0] содержит $sprite, $pair[1] - Fresca,
# a @beverages - (Dew, Jolt, Cola)
Функция splice возвращает элементы, удаленные из массива, поэтому shift2 заменяет первые два элемента @ARRAY ничем (то есть удаляет их) и возвращает два удаленных элемента. Функция рор2 удаляет и возвращает два последних элемента.
В качестве аргументов этим функциям передается ссылка на массив — это сделaнo для того, чтобы они лучше имитировали встроенные функции shift и pop. При вызове ссылка не передается явно, с использованием символа \. Вместо этого компилятор, встречая прототип со ссылкой на массив, организует передачу массива по ссылке. Преимущества такого подхода — эффективность, наглядность и проверка параметров на стадии компиляции. Недостаток — передаваемый объект должен выглядеть как настоящий массив с префиксом @, а не как скалярная величина, содержащая ссылку на массив. В противном случае придется добавлять префикс вручную, что сделает функцию менее наглядной:
$line[5] = \@list;
@got = рор2( @{ $line[5] } );
Перед вами еще один пример, когда вместо простого списка должен использоваться массив. Прототип \@ требует, чтобы объект, занимающий данную позицию в списке аргументов, был массивом.
$line[5] представляет собой не массив, а ссылку на него. Вот почему нам понадобился «лишний» знак @.

См. также

Описание функции splice



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: