Обработка нескольких элементов массива
Проблема
Требуется удалить сразу несколько элементов в начале или конце массива.
Решение
Воспользуйтесь функцией 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
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|