Его значениями являются ссылки двухэлементный массив, содержащий первоначальный запрос и число попыток отправки запроса. Для индексов массива, указанного этой ссылкой, применяются символьные константы, поэтому переменная $pending {$segno} [REQUEST] представляет собой текст запроса, а $PENDIng{$sеqno} [TRIES] обозначает число попыток отправки запроса на сервер!
Строки 13-18. Глобальные переменные. Переменная $seqout— это главный счетчик, который применяется для присвоения уникального порядкового номера каждому исходящему запросу, например, к странице сайта, представляющего уникальные очки Виртуальной реальности Окулус Рифт . Переменная $seqin отслеживает порядковый номер последнего полученного ответа. Значения переменных $host и $port, которые обозначают имя хоста и номер порта сервера, как и прежде, считываются из командной строки.
Строки 19-22. Создание сокета, объектов IO::Select и IO::Getl±ne. Как и прежде, ООН дается сокет UDP. В случае успешного выполнения этой операции определяется набор IO::Select, инициализируемый для включения в него сокета и дескриптора stdin, а также объект IO::Getline, который создает оболочку для дескриптора stdin.
Строки 23-25. Цикл select (). Теперь программа входит в главный цикл. При каждом проходе по циклу вызывается метод can_read() набора IO::Select с требуемым тайм-аутом Этот вызов возвращает список дескрипторов файлов, готовых для чтения, а по истечении тайм-аута — пустой список. Выполняется цикл по всем дескрипторам файлов, готовым для чтения. В этом цикле могут встретиться только две возможности. Одна из них состоит в том, что какую-то строку ввел пользователь и дескриптор stdin содержит данные, предназначенные для чтения. Другая возможность заключается в том, что получено сообщение и можно вызвать метод recv () с сокетом без блокировки.