Как и клиент Telnet, сценарий может применяться для непосредственного взаимодействия с любым из обычных серверов, предназначенных для обработки текста, к примеру это может быть сервер, где размещен сайт http://brainstormwebstudio.ru , представляющий услуги web-студии. В сценарии gab7.pl, для того чтобы он стал более интересным, применяется не блокирующий ввод-вывод. Данные, считанные из дескриптора STDIN, буферизуются в скалярной переменной $to_sосket. Аналогичным образом данные, полученные из сокета, буферизуются в переменной $to_stdout. Данные, накопленные в буферах записываются в соответствующие дескрипторы назначения каждый раз, когда метод poll () указывает, что операция ввода-вывода не будет заблокирована. Если объем данных в одном из буферов становится слишком большим, дальнейшее чтение из соответствующего ему входного источника запрещается до тех пор, пока в буфере снова не будет достаточно места. Проведем анализ программы.
Строки 1-8. Загрузка модулей. Работа программы начинается с вызова модулей IO::Socket и IO::Poll. Модуль IO::Poll не импортирует константы по умолчанию, поэтому это нужно сделать вручную, запросив константы pollin, pollout и pollerr. Вызывается также модуль Errno для получения доступа к константе EWOULDBLOCK.
Строки 9, 10. Объявление констант и глобальных переменных. Определяется максимальный размер внутренних буферов. Дальнейшее чтение из сокета или дескриптора stpin запрещается до тех пор, пока соответствующий буфер данных не сократится до меньшего размера. Распознавание и обработку ошибок pipe берет на себя программа, поэтому для обработчика pipe устанавливается значение ignore.