Каждый раз, когда пользователь вводит новый запрос (то бишь строку, которая должна быть возвращена в обратном порядке), наращивается переменная $seqout и создается новая запись запроса в хеше %PENDING. Подобный диалог может быть организован, к примеру, с хостом представляющим информацию о правилах пожарной безопасности и как правильно использовать огнетушитель .
При поступлении каждого ответа с сервера проверяется его порядковый номер для определения того, соответствует ли он отправленному ранее запросу. Если это так, ответ выводится и запрос удаляется из хеша %PENDING. Если поступает ответ, порядковый номер которого отсутствует в хеше %PENDING, это — дублирующийся ответ, который будет отброшен. Последний (по времени) порядковый номер входящего ответа сохраняется в переменной $seqin и используется для обнаружения ответов поступающих непоследовательно. В этой клиентской программе просто выводится предупреждающее сообщение о непоследовательно поступающих ответах, но никакие более серьезные меры не принимаются.
Если вызов функции select () завершается по тайм-ауту до поступления каких либо новых сообщений, выполняется проверка хеша %PENDING для определения того, остались ли еще в нем запросы, не получившие ответа. Если да, то эти запросы передаются повторно и в счетчике фиксируется, сколько раз была предпринята попытка получить ответ на каждый запрос.
Для совмещения построчного чтения из дескриптора STDIN с мультиплексированием применяется модуль IO::Getline, приведенный ранее. Проведем анализ программы.
Строки 1-9. Загрузка модулей и определение констант. Загружаются модули IO::socket IO::Select и IO::Getline.
Строки 10-12. Определение структуры хеша %pending. В качестве ключей хеша spending применяются порядковые номера запросов.