Perl 6

Габор Сабо. Массивы в 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 и печатая каждое из них.

Надеюсь, этот рассказ вам понравился, будет и продолжение. До свидания.

array, for — 29 июля 2010