Pull to refresh

Perl6 — Комментарии, пробельные символы, скобки

Reading time 4 min
Views 6K
Давным давно, в далекой далекой галактике на хабре появился набор статей о шестом перле
1. Особенности работы с переменными и литералами в Perl6
2. Perl6 — Операции над переменными, анонимные блоки
3. Perl6 — Условные операторы, циклы
4. Perl6 — Работа с функциями
5. Perl6 — Классы
6. Perl6 — Ввод-вывод, модули
в котором рассказывалось о некоторых сторонах Perl6. После выхода последней статьи, я начал писать следующую, в которой планировалось создать два класса, расположив их в разных модулях, и подключать их один на этапе компиляции, другой на этапе выполнения — иначе говоря закрепить уже пройденный материал. Но представте мое удивление, когда я начал получать разные ошибки компиляции в зависимости от количества пустых строк между определениями двух функций или от количества пробелов внутри условия… Причем исправляя одну ошибку, я получал вторую, которую уже исправлял до первой =) В итоге написание следующей статьи сорвалось, и я благополучно оставил её на потом, а потом естественно и времени не оказалось свободного.
Но вот сейчас я всетаки решил продолжить изучение, и раз уж у нас зашла речь о пробельных символах, то с них и начнем новую статью.


И всетаки прежде чем начать, хотелось бы заметить, что в документации заявлено о том, что в качестве идентификаторов можно использовать символы юникода, как например Δ или π, но возможно что как и ранее, эта часть ещё не допилина, либо это особенности запуска скрипта под виндой, но символы русского языка я смог использовать только внутри комментариев. В качестве значений или идентификаторов кириллицу и другие юникод-символы использовать не удалось. Но вернемся к начатому.
Комментарии в Perl6 как и прежде начинаются с символа '#' и все что идет после него до конца строки является комментарием, однако это не единственный способ создания комментариев.
Для тех кто не любит делать комментарии размером в одну длинную строку, и не любит ставить по десять символов '#' в столбик, придумали следующую конструкцию:
#`(comment)

Особенностями данного вида комментариев является то, что это многострочный комментарий. который ограничивается действием скобок, а вместо символов '(' и ')' может использоваться набор из любых парных символов юникода (при условии что файл записан в юникодовой кодировке), как например скопированный из документации набор:
#`「
test
abcd
тест
」
say "123";

Так же можно использовать, например, символы '[', '<<', '{' и соответствующие им закрывающие символы либо же вообще все сразу:
#`[{<< Comment[index] >>}]

В результате закрывающаяся скобка ']' внутри комментария будет проигнорирована не смотря на то, что комментарий начинался с открывающейся скобки '[', а сам комментарий закончится только на наборе '>>}]'.
Ещё одной особенностью комментариев является то, что если написать конструкцию
#`{comment {some text} comment }

то количество скобок '{' и '}' внутри комментария будет посчитано, и в результате комментарий будет заканчиваться именно там, где и был задуман.

Стоит также заметить, что комментарии являются прбельными символами, и если вы напишите следующую конструкцию
"text"#`(comment).say

то компилятор воспримет это следующим образом:
"text"           .say

и соответственно будет получена ошибка компиляции, так как постфиксный вызов метода не должен отделяться какими либо пробельными символами. Для того чтобы всетаки разрешить такой способ комментирования, была введена комманда экранирования пробельных символов:
"text"\   #`(comment)    .say;

Обратный слеш перед последовательностью пробельных символов (их может быть несколько, и состоять из комментариев, пробелов, табов и все что ещё может подойти под категорию пробельных символов) «вырезает» их из воспринимаемой компилятором строки, в результате чего получаем
"text".say


Хватит про комментарии, поговорим о более интересных вещах.
Все знакомы с такими вещами как квотирование ( qq/«text» 123/ ), рассмотрим данную вещь поближе (добавим немного данных из справочника):

Общая форма таких выражений это
Q :verb /data/

где в качестве :verb может выступать одно из следующих имен:
  • :q или :single — Создает строку из переданных символов в data. Данный оператор интерполирования переменных не производит
  • :qq или :double — Создает строку из переданных символов интерполируя переменные, встречаемые в поле data
  • :x или :exec — Выполняет переданную ей строку в терминале операционной системы без интерполяции строки
  • :w или :words — Создает массив из слов, разделенных пробелами
  • :ww или :quotewords — Создает массив из слов разделенных пробелами, но при этом учитывая кавычки (то что внутри кавычек считается одним словом)
  • Есть ещё набор таких же ключей, которые вы можете посмотреть здесь


Однако нам все так же доступны старые добрые версии таких команд как q/test test test/ или qw/test test test/
Можно так же их комбинировать, например
my $result = Q :exec :double /$command/;
my $sameResult = qqx/$command/;

В начале производится интерполяция строки, затем её исполнение. Следует также отметить то, что порядок следования ключей является важным, хотя я так и не заставил выполнить как мне нужно следующую строчку
my @results = Q :x :w /ver ver ver/

По задумке, строка «ver ver ver» должна была разделиться на 3 слова, и каждое из этих слов должно было выполниться как команда интерпретатора cmd, однако на выходе все что я увидел это массив из 3х слов «ver». Возможно вам следует самим попытать данный способ, я же пойду дальше

Однако вернемся к теме скобок — в случае указанных выше команд мы не ограничены одними слешами, фактически, мы можем использовать вместо них все то, что мы использовали в ограничении комментариев:
my $result = $somePath ~~ rx!/etc/init.d/!;
my $anotherResult = $somePath ~~ rx<</etc/init.d/>>;


Чтож, на сегодня пожалуй хватит. Надеюсь продолжение не заставит себя ждать.
Tags:
Hubs:
+22
Comments 20
Comments Comments 20

Articles