Пятница, 24.11.2017, 10:27
Приветствую Вас Гость | RSS
Главная | Лекции | Регистрация | Вход
Меню сайта
Форма входа
Логин:
Пароль:
Категории раздела
Лекция [24]
Мини-чат
100
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 2
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Программирование Perl
    Главная » Статьи » Лекция » Лекция

    Лекция 5.1: Списки и массивы

    Списки и списочные литералы

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

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

    (256, 512, 1024, 2048, 4096) # список из 5 чисел
    ('John', 'Paul', 'George', 'Ringo') # список из 4 строк
    ("Perl", 5.8) # список из строковых и числовых значений

    Для записи списка текстовых строк, состоящих из одного слова, предусмотрена специальная форма списочного литерала, в которой после ключевого слова qw (сокращение от quoted words - "слова в кавычках") в скобках записываются строки, не заключенные в кавычки и разделяемые пробельными символами. В качестве скобок могут использоваться традиционные символы: (), {}, //, \\, [] , <> и даже просто парные символы, такие как !! или ##. Например:

    qw(это очень удобно) # вместо ('это', 'очень', 'удобно')
    qw/John Paul
     George Ringo/ # список слов, расположенный на 2 строках

    Элементами списочного литерала могут быть не только строки и числа, но также скалярные переменные и выражения. Пустойсписок не содержит элементов и представляется списочным литералом без значений (одними круглыми скобками).

    ('One', $x, $x+$y-$z, 2*5) # список литералов и выражений
    () # пустой список

    Списочный литерал может содержать операцию диапазона, которая записывается в виде двух скалярных значений, разделенных двумя точками:

    начальное_значение .. конечное_значение

    В списочном контексте эта операция возвращает список значений. Возвращаемый список начинается со значения левого операнда, которое в цикле увеличивается на единицу, пока не будет достигнуто значение правого операнда. Приведем примеры:

    5 .. 10 # возвратит список (5, 6, 7, 8, 9, 10)
    5.3 .. 7.1 # возвратит список (5.3, 6.3), т. к. 7.3 > 7.1
    7 .. 5 # возвратит пустой список (), т. к. 5 < 7
    $m .. $n # диапазон, заданный значениями от $m до $n

    Если операция диапазона применяется к строкам, то значения списка генерируются по правилам операции автоинкремента. С ее помощью удобно записывать различные списочные литералы:

    (-2 .. 2) # список чисел (-2, -1, 0, 1, 2)
    (25, 53, 77 .. 79) # список (25, 53, 77, 78, 79)
    ('A'..'Z','a'..'z') # список заглавных и строчных букв 
    ($start .. $finish) # список значений от $start до $finish

    Если списочный литерал состоит только из имен переменных, то он может стоять в левой части операции присваивания, в правой части которой будет список присваиваемых значений. Переменным, стоящим слева от знака "равно", последовательно присваиваются значения соответствующих элементов списка из правой части операции.

    ($a, $b, $c) = (10 .. 12); # $a = 10; $b = 11; $c = 12;
    ($day, $month, $year) = (18, 12, 1987); # день рождения Perl
    ($m, $n) = ($n, $m); # поменять местами значения $n и $m

    Если в списке слева от знака присваивания переменных больше, чем значений в списке в правой части, то оставшиеся переменные получают неопределенные значения:

    ($hh, $mm, $ss, $ms) = (10, 20, 30); # $ms не определено

    Если в левой части присваивания переменных меньше, чем значений в правой, то лишние значения не используются.

    ($hh, $mm, $ss) = (10, 20, 30, 400); # 400 отброшено

    Если в левой части присваивания стоит не список, а скалярная переменная, то устанавливается скалярный контекст, в котором литеральный список возвращает значение своего последнего элемента:

    $scalar = (10, 20, 30, 400); # то же, что $scalar = 400;

    Массивы

    Значение списка может храниться в переменной, называемой массив. Перед именем переменной-массива стоит разыменовывающий префикс @ (напоминающий своим видом, что это array - "массив"). Одновременно с переменной-массивом в программе может существовать скалярная переменная с таким же именем, но с префиксом $, так как имена скаляров и массивов хранятся в разных таблицах имен (symbol tables).

    @variable # массив для хранения списка 
    $variable # скаляр для хранения строки или числа

    Списочное значение помещается в массив с помощью операции присваиванияПрисваивание выполняется по-разному в зависимости от контекста, который определяется левым операндом присваивания. Если в левой части присваивания стоит массивили список, то и в правой части ожидается список. Например:

    @empty = (); # пустой массив после присвоения пустого списка
    @months = (1 .. 12); # массив со списком номеров месяцев 
    @days = qw(Пн Вт Ср Чт Пт Сб Вс); # массив дней недели
    @week = @days; # копирование значения массива @days в @week
    @array = 25; # литерал 25 рассматривается как список (25)
    ($first) = @array; # в $first скопируется 1-й элемент массива
    @first = @second = (1, 2, 3); # каскадное присваивание

    Если в левой части присваивания стоит скалярная переменная, то устанавливается скалярный контекст и в правой части операцииожидается скалярное значение. Например, если попытаться присвоить скалярной переменной массив, то ее значением станет размер массива. Того же результата можно добиться, явно задав для массива скалярный контекст встроенной функцией scalar:

    $array_size = @months; # число элементов (размер) массива
    $array_size = scalar @months; # размер массива

    В зависимости от контекста, системная функция localtime возвращает разные значения: в скалярном контексте она вернет строку с текущей датой и временем, а в списочном - список из девяти значений с данными о дате и времени:

    $date_and_time = localtime;
    ($sec, $min, $hour, # секунды, минуты, часы
    $mday, $mon, $year, # день, месяц, год,
    $wday, $yday, $isdst) # день недели, день года, часовая зона
    = localtime;

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

    @small = (3, 4, 5); # этот массив будет вставлен в список
    @big = (1, 2, @small, 6 .. 9); # то же, что @big = (1 .. 9);
    @big = ((1, 2), (3 .. 5), (6 .. 9)); # то же, что и выше

    С помощью списка можно легко добавить новые элементы в начало или в конец существующего массива:

    @array = ($new_element, @array); # добавить элемент в начало
    @array = (@array, $new_element); # добавить элемент в конец
    @all = (@first, @second); # объединить два массива в один

    Присваивая массив списочному литералу, можно извлечь начальные элементы из массива в скалярные переменные, поместив оставшиеся элементы в исходный массив:

    ($element1, @array) = @array; # извлечь элемент из начала

    Массив в левой части присваивания имеет смысл ставить только в конце списка, поскольку он поглощает все значения, и стоящие после него переменные получат неопределенные значения:

    (@array,$a,$b) = (1,2,3,4,5); # все 5 чисел попадут в @array
    Категория: Лекция | Добавил: mazay (06.02.2014)
    Просмотров: 72 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Создать бесплатный сайт с uCozCopyright MyCorp © 2017