Вместо чтения из дескриптора STDIN с помощью оператора <>, вызывается метод getline () объекта IO::Getline для чтения строки в переменную $data. Метод getline () может вернуть ложное значение, и в этом случае происходит выход из цикла, поскольку достигнут конец файла. В ином случае он может вернуть истинное значение. Если код результата больше 0, это значит, что получена строка, которая может быть выведена; поэтому строка копируется в стандартный вывод. В противном случае становится известно, что полная строка еще не считана, поэтому снова происходит возврат в начало цикла проверки дескриптора с помощью объекта IO::Select. Для использования данного модуля на мобильных телефонах предварительно необходимо скачать на андройд приложение интерпретатора языка.
В конце цикла вызывается метод error () этой оболочки для проверки того, что был ли цикл завершен аварийно. В таком случае вызывается функция die с сообщением об ошибке, содержащим код ошибки.
Объекты IO::Getline могут также применяться в блокирующем режиме. Для этого достаточно просто вызвать метод blocking (), объекта. Этот метод автоматически проходит вниз по иерархии, вплоть до основополагающего дескриптора файла
$stdin->blocking(1) # Снова перейти к блокирующему поведению
Этот модуль будет применяться в реальных программах в разделе далее.
Модуль IO::Getline
Модуль IO::Getline иллюстрирует общий метод буферизации частичного чтения из неблокирующего дескриптора файла.
Проведем анализ программы.
Строки 1-9. Настройка модуля. Загружаются модули IO::Handle и Carp, и из модуля Errno берется константа с кодом ошибки ewouldblock. Другая константа устанавливает размер фрагментов, с которыми будут выполняться операции чтения с помощью функции sysread () из основополагающего дескриптора файла. Модуль Carp предоставляет доступ к сообщениям об ошибках, которые указывают на местонахождение ошибок с точки зрения вызывающего оператора, и поэтому они более предпочтительны для использования внутри модулей.