Проведем анализ программы, приведенную в прошлой части.
Строки 1-7. Инициализация сценария. Включена строгая проверка синтаксиса и загружен модуль IO::Socket. Импортируются константы, применяемые по умолчанию, и константы, которые служат для обозначения новой строки, путем импортирования тегов :default и :crlf. Локальный порт определяется как константа, и инициализируются счетчики байтов для накопления статистических данных. Устанавливается также значение глобальной переменной $/, равное crlf, в соответствии с соглашением, принятым в сети.
Строки 8,9. Установка обработчика сигнала INT. Устанавливается обработчик сигнала int для обеспечения корректного останова сервера при нажатии пользователем клавиши прерывания. Улучшенный обработчик просто устанавливает флажок $quit равным истинному значению.
Строки 10-15. Создание объекта сокета. Номер порта устанавливается из командной строки, а если он не указан, по умолчанию принимается жестко закодированная константа. После этого выполняется вызов метода IO::Socket::lNET->new() с параметрами, которые определяют создание приемного сокета, привязанного к указанному локальному порту. Другие параметры устанавливают опцию so_reuseaddr равной истинному значению и определяют таймаут 1 час (60*60 с) для операции accept().
Когда параметр Timeout установлен, каждый последующий вызов метода accept() будет возвращать значение undef, если в течение времени, указанного этим параметром, не было получено ни одного входящего запроса на установление соединения.
Однако в данной программе это средство применяется не ради его самого, а в связи с тем, что оно изменяет поведение метода accept(), исключая возможность автоматического перезапуска после прерывания сигналом. Это позволяет прервать работу сервера с помощью комбинации клавиш , не вкладывая сам вызов accept() в блок eval {}.