6 — Ввод-вывод. Модули

от автора

1. Особенности работы с переменными и литералами в Perl6
2. Perl6 — Операции над переменными, анонимные блоки
3. Perl6 — Условные операторы, циклы
4. Perl6 — Работа с функциями
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, которая подключает модули во время работы скрипта, только когда поток выполнения дойдет до этой инструкции, но у меня почему-то не получилось запустить ни одного примера.

ссылка на оригинал статьи http://habrahabr.ru/post/161989/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *