От 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