Perl 6

От Perl 5 к Perl 6 — Строки, массивы, хеши

Урок 1. Строки, массивы, хеши

Мориц Ленц (Moritz Lenz), перевод Анатолия Шарифулина.
Оригинальный текст: http://perlgeek.de/blog-en/perl-5-to-6/01-strings-arrays-hashes.html.

 

Краткое содержание

my $five = 5;
print "интерполированная строка,
   такая же, как в perl $five\n";
say 'say() добавляет перенос строки
   при выводе, точно так же, как в perl 5.10';

my @array = 1, 2, 3, 'foo';
my $sum = @array[0] + @array[1];
if $sum > @array[2] {
     say "не выполено";
}

my $number_of_elems = @array.elems;     # или +@array
my $last_item = @array[*-1];

my %hash = foo => 1, bar => 2, baz => 3;
say %hash{'bar'};
                       # 2
say %hash<bar>;                        
   #
тоже самое, только с автоматическим квотированием
# это ошибка: %hash{bar}

Perl 6 — почти как Perl 5, только лучше. Инструкции разделяются точками с запятыми. После последней инструкции в блоке или после закрывающей фигурной скобки в конце строки точка с запятой не обязательна.

Имена переменных, как и раньше, начинаются с сигилов (например, $, @, %), и многие встроенные функции Perl 5 почти не были изменены в Perl 6.

Строки

Строки записываются с помощью двойных (в этом случае строка интерполируется) или одинарных кавычек. Экранирование с помощью обратного слеша работает так же, как и в Perl 5.

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

my $scalar = 6;
my @array = 1, 2, 3;
say "Perl $scalar";
         # 'Perl 6'
say "An @array[]";          # 'An 1 2 3'
say "@array[1]";            # '2'
say "Code: { $scalar * 2 }" # 'Code: 12'

 

Массивы и хеши интерполируется только в том случае, если за ними указан индекс или ключ; пустые индексы интерполируют структуру данных целиком.

Блок в фигурных кавычках выполняется как блок кода, и результат интерполируется.

Массивы

Переменные массивов по-прежнему начинаются с символа @. И это всегда так, даже если присутствует индекс.

my @a = 5, 1, 2;            # скобки более не нужны
say @a[0];                  # да, начинается с @
say @a[0, 2];               # срезы тоже работают

 

Списки создаются с помощью оператора запятая. 1, — это список, а (1) — нет.

Теперь все является объектами, поэтому можно вызывать методы у массивов:

my @b = @a.sort;
@b.elems;
                   # количество элементов
if @b > 2 { say "yes" }     # тоже работает
@b.end                      # номер последнего индекса. Заменяет $#array
my @c = @b.map({$_ * 2 }); # да, map - это тоже метод

 

Существует сокращенная форма записи старой конструкции цитирования qw(..):

my @methods = <shift unshift push pop end delete sort map>;

Хеши

В то время как в Perl 5 хеши — это списки с четным числом элементов, хеши в Perl 6 — списки пар. Пары также используются для других целей, например, для именованных аргументов в функциях, но об этом позже.

Точно так же, как и с массивами, начальный символ (сигил) остается неизменным при индексации массива. А у хешей есть методы, которые можно вызывать.

my %drinks =
    France => 'Wine',
    Bavaria => 'Beer',
    USA     => 'Coke';
say "Французы любят ", %drinks{'France'};
%drinks.delete('France');

 

Обратите внимание, что когда вы обращаетесь к элементам хеша, используя конструкцию %hash{...}, ключи автоматически не квотируются, как в Perl 5. Поэтому %hash{foo} не возвратит значение по ключу foo, а вызовет функцию foo(). Автоматическое квотирование не исчезло, просто изменился синтаксис:

say %drinks<Bavaria>;

Напоследок

Многие встроенные методы существуют и как методы, и как функции. Поэтому возможно писать как sort @array, так и @array.sort.

Наконец, следует знать, что [..] и {...} - это всего лишь способ вызова со специальным синтаксисом, а не что-то специфичное для массивов или хешей. Это означает, что они также не привязаны и к конкретному сигилу.

my $a = [1, 2, 3];
say $a[2];          # 3

Это означает, что не требуется использовать специальный синтаксис для разыменования и можете создавать объекты, которые будут себя вести одновременно как массивы, хеши или функции.

Ссылки по теме

http://perlcabal.org/syn/S02.html
http://perlcabal.org/syn/S29.html

array, string, hash — 24 ноября 2008