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

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

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

    Элементы массива

    Элементы массива - это скалярные величиныдоступ к которым происходит по их порядковому номеру (индексу). Поскольку элемент массива - это скаляр, то его обозначение состоит из разыменовывающего префикса $ перед именем массива, за которым в квадратных скобках стоит индекс. Индексы элементов массива задаются целыми числами, начиная с нуля. (Номер начальногоиндекса массивов раньше мог задаваться значением специальной переменной $[, но сейчас эта возможность считается устаревшей, поэтому поступать так не рекомендуется.) Вот так выглядит в программе обращение к элементам массива:

    @array # переменная-массив, хранящая список
    $array[0] # первый элемент массива с индексом 0
    $array[1] # второй элемент массива с индексом 1
    $array[$i] # i-й элемент массива, считая с 0
    $array # скаляр, не имеющий отношения к массиву @array

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

    $array[-1] # последний элемент, то есть 1-й от конца 
    $array[-2] # предпоследний элемент, то есть 2-й от конца 
    $array[-$n] # n-й элемент массива, считая с конца

    Индекс последнего элемента массива, который всегда на единицу меньше размера массива, можно узнать, указав специальныйпрефикс $# перед именем массива:

    $last_index = $#array; # индекс последнего элемента @array

    Так, например, можно выбрать элемент массива с помощью встроенного генератора случайных чисел rand, который возвращает дробное число от 0 до числа, указанного ему в качестве аргумента. Ограничим случайные числа номером последнего индекса в массиве и будем округлять их до целых значений функцией int:

    $random_element = $array[int(rand($#array))];

    В $#array можно присвоить новое значение последнего индекса, при этом размер массива изменится. Но такое действие обычно не требуется, так как массив при необходимости увеличивается автоматически. Размер массива в Perl не ограничивается, то естьмассив может занимать всю отведенную программе память.

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

    $birthday[0] = 18; $birthday[1] = 12; $birthday[2] = 1987;
    ($birthday[0], $birthday[1], $birthday[2]) = (18, 12, 1987);

    (Хотя более естественно для подобного присваивания воспользоваться срезом массива: @birthday[0, 1, 2] = (18, 12, 1987), но о срезах пойдет речь чуть позже в этой лекции.)

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

    $birthday[5] = 'Perl'; # размер @birthday теперь 5
    # значение $birthday[3] и $birthday[4] не определено

    При попытке обратиться к элементу массива с несуществующим индексом будет возвращено неопределенное значение, но ошибки во время выполнения программы не возникнет.

    $array[$#array+100] # неопределенно

    При использовании в качестве индекса массива дробного числа будет взята его целая часть, то есть $array[3.5]рассматривается как $array[3].

    Часто требуется последовательно перебрать все элементы массива, от первого до последнего, для обработки или вывода их значений. Это можно сделать вполне традиционным образом, с помощью цикла for, как это записывается в языках C или Java, а именно:

    for (my $i = 0; $i < scalar @array; $i++) {
     print "$array[$i] ";
    }

    Perl предлагает для подобных действий более удобный способ с использованием цикла foreach, в котором все элементы массива поочередно совмещаются с указанной скалярной переменной. Эта переменная на время выполнения цикла становится синонимом очередного элемента массива, поэтому ее значение доступно не только для чтения, но и для изменения. Только что приведенный пример можно переписать так:

    foreach my $element (@array) { # $element это синоним
     print "$element "; # очередного элемента $array[$i]
    }

    Можно то же самое записать еще более кратко с помощью модификатора foreach, который поочередно перебирает все элементы массива, рассматривая специальную переменную $_ как синоним текущего элемента массива (то есть переменная $_совмещается с очередным элементом массива):

    print "$_ " foreach @array;

    Так что каждый Perl-программист выбирает свой способ перебора всех элементов массива в полном соответствии с лозунгом TIMTOWTDI.

    Обратите внимание, что значения элементов массива, будучи обычными скалярами, интерполируются в строках, заключенных в двойные кавычки. Целые массивы тоже интерполируются, если имя массива появляется в строке, обрамленной двойными кавычками. При этом значения элементов массива разделяются символом, хранящимся в специальной переменной $" (по умолчанию - пробелом). Вот еще один способ напечатать значения всех элементов массива, разделяя их двоеточиями:

    $" = ':'; # установим разделитель элементов
    print "@array";

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

    $fifth = (10..15)[5]; # то же, что $fifth = 15;

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

    $hex = (0..9,'A'..'F')[$dec]; # при $dec==12 в $hex будет 'C'

    Подобным же образом удобно обращаться к элементу списка, возвращаемого функцией. Например, так можно извлечь день месяца, зная, что у него 3-й индекс в результирующем списке функции localtime:

    $month_day = (localtime)[3]; # элемент списка с индексом 3

    Срезы

    В Perl есть удобная форма обращения к нескольким элементам массива одновременно, называемая срезом массива. Срез (slice) - это набор элементов массива, заданный списком индексов этих элементов. Срез обозначается квадратными скобками после имени массива, в которых перечислены индексы элементов. Поскольку значение среза - это список, при записи среза перед именем массива сохраняется префикс @. Срез массива в частном случае может состоять из одного значения, заданного одним индексом. Вот примеры срезов массивов:

    @array[0,1] # то же, что ($array[0], $array[1])
    @array[5..7] # то же, что ($array[5],$array[6],$array[7])
    @array[3,7,1] # то же, что ($array[3],$array[7],$array[1])
    @array[@indexes] # срез, заданный массивом индексов
    @array[5] # список ($array[5]), а не скаляр $array[5]

    С помощью срезов удобно одновременно манипулировать значениями нескольких элементов, находящихся в любом месте массива:

    # присвоить значения пяти элементам:
    @array[5..9] = qw(FreeBSD Linux MacOS NetWare Windows); 
    # поменять местами значения 1-го и последнего элементов:
    @array[0,-1] = @array[-1,0];
    # напечатать элементы с индексами от $start до $finish
    print @array[$start .. $finish];

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


    Категория: Лекция | Добавил: mazay (06.02.2014)
    Просмотров: 296 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Создать бесплатный сайт с uCozCopyright MyCorp © 2024