Габор Сабо. Скаляры в Perl 6
Габор Сабо подготовил серию видеоуроков, посвященных основам Perl 6. Вашему вниманию предлагается русский перевод первой части — про скаляры. Оригинальный скринкаст на английском языке доступен на ютубе.
Привет! Меня зовут Габор Сабо. Это первая часть серии презентаций о языке Perl 6. Сегодня я расскажу о скалярах.
Я пользуюсь Rakudo, самой мощной реализацией Perl 6. Rakudo можно загрузить с его сайта либо в бинарном виде, либо в исходниках и затем собрать самостоятельно.
Если потребуется помощь, то лучшее место для этого — IRC-канал #perl6 на irc.freenode.net. Там много полезных людей, я тоже там, под ником szabgab.
После загрузки и установки Rakudo в командной строке можно написать perl6, нажать Enter, и вскоре попасть в интерактивный режим Perl 6. Это можно сделать и на линуксе, как у меня, или на Windows, или на Mac OS X. И, вероятно, и на других юникс-машинах тоже.
В интерактивном режиме можно печатать разные команды на Perl 6. Первым делом я хочу увидеть ключевое слово say:
say 42
42
Оно получает значение и печатает его на стандартном выводе. Аналогично, можно передать строку, и она будет напечатана.
say "hello"hello
Perl 6 объектно-ориентирован, поэтому вместо say "hello" я могу написать "hello", затем точку и say:
"hello".say
hello
Это вызовет тот же метод на объекте — строке "hello".
Остальные примеры сохранены в файлах. Чтобы их показать, я воспользуюсь функцией Perl 6 slurp, которая примет значение — строку — имя файла, и прочитает содержимое файла. Поскольку мы в интерактивном режиме, результат вызова функции будет напечатан, и мы увидим содержимое файла.
slurp '01.p6'
use v6; say "Hello world";
Первая строка — use v6;. Она не обязательна, но очень полезна, потому что если напечатать perl и имя скрипта, то запустится Perl 5, и он попытается выполнить скрипт как программу Perl 5. Без use v6; появятся странные ошибки из-за того, что Perl 5 не понимает кода. С use v6; сообщение об ошибке будет полезным — о том, что версия перла не достаточно новая, чтобы выполнить этот код.
Вторая часть кода — просто say со строкой.
Чтобы проверить этот пример, я опять вызываю slurp, но теперь, вместо печати на экран я вызываю функцию eval на результате работы slurp. То есть eval получит содержимое файла, скомпилирует его и выполнит.
eval slurp '01.p6'
Hello world
Hello world появляется на экране.
Второй пример, как можно видеть, содержит такую же строку, а затем выводит приглашение (prompt) ко вводу значения в командной строке.
slurp '02.p6'use v6; my $name = prompt "Please type in your name: "; say "Hello $name, how are you?";
Таким способом в Perl 6 возможно задать вопрос, а затем считать ответ со стандартного ввода (с клавиатуры). Prompt напечатает строку, дождется, когда пользователь что-либо введет и нажмет Enter. Содержание пользовательского ввода попадет в скаляр $name.
В Perl 6, точно так же, как и в Perl 5, имена переменных-скаляров начинаются с символа доллара, а переменные могут содержать или число, или строку, или любое одиночное значение.
В Perl 6 каждую переменную нужно объявлять до использования. Поэтому здесь мы используем для этого ключевое слово my.
Итак, имея переменную и ее содержание, я могу вновь воспользоваться say, чтобы напечатать строку, и поместить $name внутрь строки в двойных кавычках. В отличие от многих других языков, напечатается содержимое переменной $name, а не доллар и name. Это называется интерполяцией, как и в Perl 5.
Запускаем этот код:
eval slurp '02.p6'
Нас спрашивают имя:
Please type in your name:
Я печатаю свое имя:
Please type in your name: Foo
И печатается «Как дела?»:
Hello Foo, how are you?
Пользователей Perl 5 может удивить, что после Foo нет перевода строки, даже несмотря на то, что я не отрезал его от введенной строки. Это из-за того, что prompt, как и большинство других способов ввода в Perl 6, автоматически убирает перевод строки.
Запускаем следующий пример:
eval slurp '03.p6'
When were you born?
Программа спрашивает о дате рождения, поэтому я набираю 2000, потому что это легко набрать :-)
When were you born? 2000
И получаю ответ:
You are younger than Perl by 13 years
Очевидно, что 13 вычислено из значений 2000 и года, когда был создан Perl. Давайте посмотрим, как это работает.
slurp '03.p6'
use v6;
my $year = prompt "When were you born? ";
if $year > 1987 {
say "You are younger than Perl by { $year - 1987 } years";
}
Вторая строка уже знакома — здесь выводится приглашение и считывается ответ в переменную $year.
Затем — условие if $year > 1987 (год, когда был выпущен Perl 1.0). Как видите, в Perl 6 вокруг условия не нужны скобки. Но по-прежнему нужны фигурные скобки вокруг блока, который будет выполнен, если условие было истинным.
Затем, внутри условного блока, — только одна строка. Не две (строка и выражение). В Perl 6 возможно внедрить любое выражение внутрь строки в двойных кавычках, просто поместив выражение в фигурные скобки. Perl 6 заметит, что здесь есть выражение, выполнит его, а результат будет подставлен в строку.
В следующем примере мы вновь задаем пользователю тот же вопрос:
slurp '04.p6'
use v6;
my $year = prompt "When were you born? ";
if 1995 > $year > 1987 {
say "You are younger than Perl 1 but older than Perl 5";
}
Но на этот раз мы проверяем два условия: 1995 > $year > 1987; год $year находится между двумя числами. Как видите, не требуется делать две раздельные проверки и соединять их ключевым словом and. В Perl 6 разные условия возможно объединять в цепочки.
В последнем примере я опять спрашиваю число:
slurp '05.p6'
use v6;
my $luck = prompt "What is your lucky number? ";
if $luck == 3 or $luck == 7 or $luck == 13 {
say "Oh, that's like mine";
}
if $luck == 3|7|13 {
say "Oh, that's like mine";
}
А затем проверяю, совпадает ли счастливое число с 3, 7 или 13. Обычно это делается так:
if $luck == 3 or $luck == 7 or $luck == 13
В Perl 6 этого не нужно: можно просто спросить, является ли $luck тремя, семью или тринадцатью:
if $luck == 3|7|13
Это называется объединением (junction).
На сегодня все. Надеюсь, это вам понравилось и вы начнете пользоваться Perl 6. До свидания.