Как обратиться к элементу массива в Perl

Задача. В Perl программе есть массив. Нужно прочитать значение одного из элементов этого массива.

Вот пример как это сделать:

▶ Run
#!/usr/bin/perl

my @arr = ('one', 'two', 'three');

print $arr[1];

Если сохранить текст этой программы в файл script.pl и запустить perl script.pl, то на экране появятся текст two.

Итак, что здесь происходит.

Сначала мы создали массив с именем @arr. Переменная-массив начинается с символа @, этот символ похож на первую букву от слова "array". Мы создали массив и разместили в нем 3 элемента. В нашем примере все 3 элемента — это строки, но вообще в одном массиве могут быть элементы совершенно разных типов, например, строки, числа и ссылки.

У каждого элемента в массиве есть свой порядковый номер. Этот номер называется "индекс". В языке программирования Perl, как и во множестве других языков программирования элементы массива начинают нумероваться с числа 0. В примере в массиве содержится 3 элемента:

  • строка 'one' — это элемент массива с индексом 0
  • строка 'two' — это элемент массива с индексом 1
  • строка 'three' — это элемент массива с индексом 2

Для того чтобы обратиться к элементу массива с индексом 1 нужно написать $arr[1]. Пишем имя массива и в квадратных скобках пишем индекс элемента который нам нужно получить. Обратите внимание на одну особенность. Когда мы обращаемся к одному элементу массива, то вместо символа @ в имени массива нужно написать символ $ (знак доллара, символ похож на первую букву в слове "scalar"). Идея была в том что при такой записи мы явно подчеркиваем что нам нужно получить одно значение, но, на мой взгляд, это ошибка в дизайне языка. Это ничего не упростило, а наоборот сделало все сложнее. В языке программирования Perl6 это исправлено, но в Perl5 при обращении к элементу массива нужно использовать именно знак доллара $: $arr[1].

Обратиться к последнему элементу в массиве

При создании массива @arr автоматически появляется переменная $#arr в котором содержится индекс последнего элемента. При добавлении/удалении элементов из массива значений этой переменной автоматически меняется (и даже можно самому записать число в эту переменную).

Для обращения к последнему элементу массива можно использовать запись $arr[$#arr]. Но удобнее использовать $arr[-1]. Индекс -1 означает индекс последнего элемента в массиве, индекс -2 — предпоследнего и т.д.

Неправильный способ

Вот пример кода (аккуратно, тут содержится ошибка):

▶ Run
#!/usr/bin/perl

my @arr = ('one', 'two', 'three');

print @arr[1]; # error

Этот вариант точно так же как и правильный, но вместо правильного обращения к элементу массива с помощью $arr[1] тут используется @arr[1].

Если сохранить текст этой программы в файл script.pl и выполнить ее perl script.pl, то на экране будет текст two. Строка 'two', это действительно элемент с индексом 1 в массиве @arr, так что на первый взгляд ошибки не видно.

Но если добавить в код программы строку use warnings; (что практически всегда стоит делать), то в выводе программы будет видно предупреждение:

Scalar value @arr[1] better written as $arr[1] at script.pl line 7.
two

Форма записи @arr[ ] — это получение нескольких значений из массива. Это называется "срез". Несколько примеров:

  • @arr[1,2] — возвращает список из двух элементов, элементы массива с индексами 1 и 2
  • @arr[0..2] — возвращает список из трех элементов, элементы массива с индексами 0, 1 и 2
  • @arr[1, 1] — возвращает список из двух элементов, повторяет элемент с индексом 1 два раза

Запись @arr[1] — возвращает список из одного элемента, плюс выдает предупреждение.

Запись @arr[1,] — возвращает список из одного элемента без вывода предупреждения.

Если вам нужно значение одного элемента из массива, то лучше писать $arr[1].

Связанные темы

Другие статьи

Комментарии