Pull to refresh

Perl6 — Ввод-вывод, модули

Reading time3 min
Views4.8K
1. Особенности работы с переменными и литералами в Perl6
2. Perl6 — Операции над переменными, анонимные блоки
3. Perl6 — Условные операторы, циклы
4. Perl6 — Работа с функциями
5. Perl6 — Классы

И так, после длительного перерыва я вернулся с изучению шестого перла. В этот раз я решил рассмотреть как же можно вести диалог с пользователем, и как работать с файлами, а также как можно разделить весь скрипт на различные модули.


В Perl6 для вывода текста на экран могут быть использованы две функции:
say 'text';
print "text\n";

Разница между ними, как вы уже поняли из примера, в том, что 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, которая подключает модули во время работы скрипта, только когда поток выполнения дойдет до этой инструкции, но у меня почему-то не получилось запустить ни одного примера.
Tags:
Hubs:
Total votes 12: ↑9 and ↓3+6
Comments20

Articles