Поиск

Помещение скаляров в список или массив

Создать список литералов очень просто — достаточно заключить в скобки набор скалярных значений. Например:

(5, 'яблоко', $х, 3.14159)

В этом примере создается четырехэлементный список, содержащий число 5, слово 'яблоко', скалярную переменную $х и число я. Если список должен состоять только из обычных строк, можно обойтись без кавычек, для этого в Perl имеется оператор qw;

qw ( яблоки апельсины 45.6 $х )

Здесь создается четырехэлементный список. Каждый элемент может быть отделен от соседних символом пробела, табуляторами или символом перевода строки. Обратите внимание, что $х является литералом, т.е. строкой '$х', а не переменной $х, вместо которой подставляется ее значение. Если элементы списка должны содержать пробелы, то оператор qw использовать нельзя. Вместо него нужно использовать такую конструкцию:

('яблоки', 'апельсины', '45.6', '$х')

Обратите внимание, что литерал $х заключен в одинарные кавычки. Оператор qw не выполняет интерпретацию элементов списка, похожих на имена переменных, он воспринимает Их буквально. Таким образом, '$х' не заменяется значением переменной $х, а оставляется в первоначальном виде.

В Perl имеется полезный оператор для работы со списками литералов — оператор диапазона. Оператор диапазона выглядит как пара точек (..). Ниже приведен пример использования этого оператора:

(1..10)

Оператор диапазона создает список, состоящий из всех целых чисел диапазона, заданного его левым и правым операндами (в нашем примере список будет состоять из целых чисел от 1 до 10 включительно). Если в списке должны быть представлены несколько диапазонов — используйте несколько операторов:

(1.-10, 20..30);

В этом примере создается список из 21 элемента: целые числа от 1 до 10 и от 20 до 30 включительно. Если правый операнд оператора диапазона меньше, чем левый, как в (10.. 1), создается пустой список.

Оператор диапазона можно применять не только к числам, но и к строкам. Диапазон (a..z) создает список, состоящий из 26 строчных букв. Диапазон (aa..zz) создает куда более длинный список, состоящий из 675 буквенных пар, начинающийся с аа, ab, ad и заканчивающийся- zx, zy, zz.

Массивы

Списки литералов обычно используются для инициализации некоторых других структур, таких как массив или хэши. Для того чтобы создать в Perl массив, достаточно что-нибудь поместить в него. В отличие от других языков программирования, массив не нужно заранее объявлять и указывать его размерность. Создать новый массив и поместить в него элементы можно следующим образом:

@boys=qw( Гриша Петя Борис);

В этом примере инициализации массива используется оператор присваивания. Следует отметить, что оператор = применяется для присваивания значения как скалярам, так и массивам. После выполнения этого кода массив @boys будет содержать три элемента: Гриша, Петя и Борис. Обратите внимание на использование оператора qw, избавляющего от необходимости набирать шесть кавычек и две запятые. В присваивании значения элементам массива могут участвовать другие массивы и даже пустые списки:

@сору=@original;
@с1еаn=();

В этом примере все элементы массива (@original копируются в новый массив (@сору. Если @copy содержал элементы, они будут потеряны. Второй оператор очищает массив @clean. Присваивание переменной пустого списка или пустого массива удаляет все ее элементы.

Если список литералов содержит другие списки, массивы или хэши, эти списки сводятся в один обший список, например:

@boys=qw (Гриша Петя Борис );
@girls=qw( Наша Юля Света );
@kids=(@boys, @girls);
$family=(@kids, ('Миша', 'Катя'), 'Алиса');

.. Список (@boys, @girls) преобразуется Perl в один простой список имен всех детей (Гриша, Петя и т.д.) перед тем, как его значения присваиваются переменной @kids. В следующей строке кода массив @kids и список ('Миша', 'Катя') сводятся в один длинный список, затем этот список присваивается переменной @family. Первоначальные структуры @boys, @girls, @kids и ('Миша', 'Катя') не будут представлены в окончательном списке @family, там лишь находятся их элементы, такие как Миша и Катя. Это означает, что предыдущий пример создания массива @family эквивалентен такому оператору присваивания:

@family=qw(Гриша Петя Борис Наша Юля Света Миша Катя Алиса);

Если слева от оператора присваивания находится список имен переменных, эти переменные инициализируются элементами списка. Рассмотрим пример:

($а, $b, $c) = qw(яблоки апельсины бананы);

Здесь переменная $а инициализируется значением 'яблоки', $Ь — 'апельсины' и $с — 'бананы'. Если в списке слева содержится массив, этот массив "забирает" все возможные значения из правого списка. Например:

В этом примере переменной $а присваивается значение 'персики'. Остальные фрукты из правого списка присваиваются массиву @fruit. Переменной $с не достается значения, так как все значения "вобрал" в себя массив @fruit. Переменная $с становится неопределенной (undef).

Важно помнить, что если слева от оператора присваивания находится больше переменных, чем справа, избыточные переменные получают значение undef. Если справа больше элементов, чем слева, избыточные элементы справа просто игнорируются. Вот пример:

В первой строке переменным $t, $u и $v присваиваются значения из списка, находящегося в правой части оператора присваивания. Избыточный элемент правой части ('перепелка') попросту не используется в выражении. Во второй строке переменным $а , $Ь и $с присваиваются значения из списка, находящегося в правой части оператора присваивания, а переменной $d значения "не хватило" (последний элемент 'суслик' присваивается переменной $с). Следовательно, значение $d становится неопределенным (undef).