1. Особенности работы с переменными и литералами в Perl6
2. Perl6 — Операции над переменными, анонимные блоки
3. Perl6 — Условные операторы, циклы
4. Perl6 — Работа с функциями
5. Perl6 — Классы
И так, после длительного перерыва я вернулся с изучению шестого перла. В этот раз я решил рассмотреть как же можно вести диалог с пользователем, и как работать с файлами, а также как можно разделить весь скрипт на различные модули.
В Perl6 для вывода текста на экран могут быть использованы две функции:
say 'text';
print "textn";
Разница между ними, как вы уже поняли из примера, в том, что say автоматически добавляет перевод строки после вывода всех переданных ей аргументов, в то время как print выводит все в одну строку.
Однако данные функции фактически являются методами объекта IO(), и если не указан объект, для которого вызывается метод, то используется объект $*OUT
$*OUT.say("Hello");
$*OUT.say: 'Hello';
Объект $*IN используется для считывания текста с клавиатуры.
Методы у этого объекта get и lines:
my @mas = $*IN.lines;
say @mas.elems;
В данном примере с клавиатуры считываются все строки, окончание ввода ^z.
В следующем примере считывается только одна строка
my $str = $*IN.get;
say $str;
Для работы с файлами используется функция open, которая возвращает объект того же типа что и переменные $*OUT и $*IN — IO():
my $file = open 'D:/test.txt', :r;
Для выбора режима открытия используются поименованные аргументы :r, :w, :a которые можно группировать
Так же стоит учесть, что если выбран только режим :r, то выполнение скрипта завершиться с ошибкой, если указанные файл файл не будет существовать.
Указанные выше поименованные параметры не единественные. Можно например указать :chomp(False), и у считываемых строк не будут удаляться символы конца строки. Об остальных параметрах можно почитать в документации.
Класс IO() содержит ещё несколько дополнительных методов, как например получение номера строки в файле, и т.п. Если возникнет необходимость, то их так же можно посмотреть в документации.
Создание модулей
Для создания своего модуля используется ключевое слово module:
module MyModule1;
module MyModule2 {...};
Для указания того, какие функции будут доступны в скрипте, который подключает данный модуль используется следующая конструкция is export:
module MyModule;
sub HiddenSub {...};
sub ExportedSub is export {...};
В результате если подключить данный модуль, то вызывать можно будет только функцию ExportedSub
Подключается модуль коммандой use moduleName;
Так же можно учитывать условия, когда необходим экспорт:
module ModuleName;
sub Test1 is export(:myConst) {...};
sub Test2 is export(:myAnotherConst, :myAdditionalConst) {...};
sub Test3 is export(:myAdditionalConst);
sub Test4 is export(:MANDATORY) {...};
Подключать можно следующим образом
use ModuleName :myConst, :myAnotherConst;
:MANDATORY экспортирует объект независимо от того, какие параметры были указаны.
Если указан параметр :myConst то будут импортированы Test1, Test2 и Test4
Однако если указать
use ModuleName :myAnotherConst, :myAdditionalConst
то произойдет ошибка при компиляции — произойдет повторный импорт функции Test2
Если указать
class MyClass is export
{
method MyMethod {...}
}
то все методы класса автоматически будут экспортированы.
Так же стоит упомянуть о том, что use подключает модули во время компиляции. Кроме неё есть функция require, которая подключает модули во время работы скрипта, только когда поток выполнения дойдет до этой инструкции, но у меня почему-то не получилось запустить ни одного примера.
Автор: WarFair