Габор Сабо. Массивы в Perl 6
Габор Сабо подготовил серию видеоуроков, посвященных основам Perl 6. Вашему вниманию предлагается русский перевод второй части — про массивы. Оригинальный скринкаст на английском языке доступен на ютубе.
Привет! Меня зовут Габор Сабо, и сейчас будет вторая часть презентаций о Perl 6. На этот раз я расскажу про массивы. Если вам интересны темы, связанные с Perl 6, посмотрите на ссылки на странице szabgab.com/perl6.html.
Рассмотрим первый пример.
use v6;
my @names = ("Foo", "Bar", "Moo");
say @names;
Как и в Perl 5, символ @ означает массивы. То есть здесь мы объявляем массив и помещаем в него три значения — три строки. Чтобы распечатать содержимое массива, достаточно напечатать say и имя массива.
Я переключаюсь в другое окно, с интерактивным режимом, в котором мы работали в первой части, и там печатаю:
eval slurp '01.p6'
FooBarMoo
Как видите, печатаются значения, правда, одно за другим. Границы между ними не видны, что не очень удобно для отладки.
Лучше всего — воспользоваться методом .perl на массиве:
say @names.perl;
Здесь возвращается строка, и если ее выполнить (через eval), то получится исходная структура данных.
["Foo", "Bar", "Moo"]
Действительно удобно для отладки.
Если требуется напечатать только один из элементов, например, второй, индекс которого — 1, его нужно указать в квадратных скобках после имени массива:
say @names[1];
Если это выполнить, напечатается второй элемент.
Bar
Пользователи Perl 5 заметят, что сигил при этом не изменился. Это потому, что в Perl 6 сигилы не изменяются. Массив всегда будет сопровождаться символом @.
На самом деле, индекс необязателен, можно оставить скобки пустыми, что будет означать весь массив:
say @names[]
При выполнении опять получаем те же три значения:
FooBarMoo
Кроме того, в отличие от Perl 5, скобки вокруг массива не обязательны:
my @names = "Foo", "Bar", "Moo";
По-прежнему создается массив, и по-прежнему печатаются значения:
FooBarMoo
А что если мне захочется интерполировать массив?
use v6; my @names = "Foo", "Bar", "Moo"; say "Hello @names how are you?";
Выполняем второй пример:
eval slurp '02.p6'
Hello @names how are you?
Как видите, @names оказывается на печати. В Perl 6 массивы автоматически не интерполируются. Чтобы этого добиться, нужно поставить квадратные скобки — тут они очень пригодятся.
say "Hello @names[] how are you?";
Hello Foo Bar Moo how are you?
На этот раз Perl понимает, что мы, на самом деле, имели в виду массив по имени @names, и вставляет все значения из массива внутрь строки, разделяя их пробелами.
Аналогично, я могу указать индекс, и проинтерполируется соответствующее значение:
say "Hello @names[1] how are you?";
Hello Bar how are you?
Существует и другой способ интерполировать значения: поставить вокруг переменной фигурные скобки:
say "Hello {@names} how are you?";
Выполнив, получим все три значения из массива:
Hello Foo Bar Moo how are you?
Перехожу к третьему примеру. Внутри фигурных скобок можно поместить любое выражение, перл его вычислит, а результат подставится в строку.
use v6;
my @names = "Foo", "Bar", "Moo";
say "Hello { join('; ', @names) } how are you?";
Здесь мы видим вызов функции join, которая получает строку и массив, берет его элементы и размещает эту строку между ними, создавая составную строку, в нашем случае из трех элементов.
Выполняем этот вариант.
eval slurp '03.p6'
Hello Foo; Bar; Moo how are you?
И видим, что между элементами вставились точки с запятыми и пробелы.
Когда надоест печатать кавычки и запятые при создании массива, то можно применить угловые скобки:
use v6;
my @names = <Foo Bar Moo>;
say "Hello {@names} how are you?";
Это работает аналогично qw в Perl 5: из трех значений создается список из трех элементов.
На последнем примере посмотрим, как можно в цикле пройтись по элементам массива.
use v6;
my @names = <Foo Bar Moo>;
for @names -> $n {
say $n;
}
Я воспользовался циклом for, он получает массив, а затем, после стрелочки, скаляр. Как видите, этот скаляр не обязательно объявлять с помощью my, потому что перл автоматически создаст его для нас внутри области видимости следующего блока, так что там не придется беспокоиться о $n.
В примере for пройдется по всем значениям в @names, помещая в $n Foo, потом Bar, потом Moo и печатая каждое из них.
Надеюсь, этот рассказ вам понравился, будет и продолжение. До свидания.