ПрограммированиеPerl разработчик

Опишите особенности работы с переменными в Perl. Чем отличаются переменные-скаляры, массивы и хэши? Приведите примеры использования каждого типа.

Проходите собеседования с ИИ помощником Hintsage

Ответ

В Perl переменные делятся на скаляры ($), массивы (@) и хэши (%):

  • Скаляры ($variable) – хранят одно значение (строка, число):

    my $name = "Ivan"; my $age = 30;
  • Массивы (@array) – набор упорядоченных элементов (индексируются числами):

    my @fruits = ("apple", "banana", "cherry"); print $fruits[1]; # banana
  • Хэши (%hash) – набор пар ключ-значение (ассоциативный массив):

    my %colors = (red => "#ff0000", green => "#00ff00"); print $colors{"red"}; # #ff0000

Обратите внимание, что для обращения к элементу используется специфический символ в зависимости от типа переменной:

  • $array[0] — элемент массива
  • $hash{"key"} — значение хэша по ключу

Вопрос с подвохом

Чем отличаются выражения @array[1,2] и $array[1,2]?

Ответ:

  • @array[1,2] — предоставляет список с несколькими элементами массива (срез).
  • $array[1,2] — неверно, приводит к ошибке. Для доступа к нескольким элементам массива используют только срез @array[...].

Пример:

my @array = (10, 20, 30, 40); my @slice = @array[1,2]; # (20, 30)

Примеры реальных ошибок из-за незнания тонкостей темы


История

В проекте логирования программист обратился к элементу хэша через @colors{"red"}. В результате получалось не значение хэша, а случайная ошибка, потому что для одиночного значения нужен $, а не @.


История

В одном сервисе для итерации по индексам массива забыли использовать правильное обращение — вместо $array[$i] использовали @array$i, что приводило к предупреждениям и неверным результатам.


История

В API проекте описали функцию, принимающую массив как $args, а на вызове передавался массив без скаляра: func(@list). Оказалось, что таким образом элементы массива "раскладываются" в список, и функция работала не так, как ожидали. Правильно было принимать массив как @args.