PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 132


Комментарий

Часто бывает удобно оформить эти операции в виде функций:

sub shift2

return splice(@{$_[0]},   0,   2),

sub pop2 (\@)  {

return splice(@{$_[0]},   0,   -2), >

Использование функций делает код более наглядным:

©friends = qw(Peter Paul Mary Jim Tim), ($this    $that) = shift2(pfriends),

#  $this содержит Peter,   $that - Paul,

#  a ©friends - Mary,   Jim и Tim

©beverages = qw(Dew Jolt Cola Sprite Fresca),

@pair = pop2(©beverages),

U $pair[0] содержит $sprite, $pair[1] - Fresca,

# a ©beverages - (Dew, Jolt, Cola)

Функция splice возвращает элементы, удаленные из массива, поэтому shif t2 за­меняет первые два элемента @ARRAY ничем (то есть удаляет их) и возвращает два удаленных элемента. Функция рор2 удаляет и возвращает два последних элемента.

В качестве аргументов этим функциям передается ссылка на массив — это сде­лано для того, чтобы они лучше имитировали встроенные функции shift и pop. При вызове ссылка не передается явно, с использованием символа \. Вместо это­го компилятор, встречая прототип со ссылкой на массив, организует передачу массива по ссылке. Преимущества такого подхода — эффективность, наглядность и проверка параметров на стадии компиляции. Недостаток — передаваемый


134   Глава 4 • Массивы

объект должен выглядеть как настоящий массив с префиксом @, а не как скаляр­ная величина, содержащая ссылку на массив. В противном случае придется добав­лять префикс вручную, что сделает функцию менее наглядной:

$line[5] = \@list,

©got = рор2( @{ $lme[5]  }  ),

Перед вами еще один пример, когда вместо простого списка должен использо­ваться массив. Прототип \@ требует, чтобы объект, занимающий данную позицию в списке аргументов, был массивом. $line[5] представляет собой не массив, а ссыл­ку на него. Вот почему нам понадобился «лишний» знак @.

> Смотри также ---------------------------------------------------------------------------------------------

Описание функции splice вperlfunc(l); раздел «Prototypes» perlsub(i). Функ­ция splice используется в рецепте 4.9.




- Начало -  - Назад -  - Вперед -