Строки 1-5. Загрузка модулей. Работа начинается с загрузки модулей Chatbot::Eliza и IO:: Socket и импорта константы wnohang из модуля posix. Определяется также порт, из которого должен принимать запросы сервер, например содержащий информацию по скриптам http://alaev.info/blog/post/2681 . В данном случае порт с номером 12000.
Строки 6, 7. Определение констант и переменных. Определяется применяемый по умолчанию порт, к которому должна быть выполнена привязка, и инициализируется глобальная переменная $quit, которая принимает ложное значение. Как только эта переменная примет истинное значение, произойдет выход из главного цикла сервера.
Строки 8-11. Установка обработчиков сигналов. Устанавливается обработчик сигнала chld с использованием общей схемы применения функции waitpid.(), которая была описана ранее.
$SIG{CHLD} = sub { while ( waitpid(-1, WNOHANG) >0 ) };
Желательно также обеспечить корректное завершение работы сервера после ввода кода прерывания в командной строке, поэтому создается обработчик сигнала int. Этот обработчик просто устанавливает истинное значение переменной $quit и выполняет возврат.
Строки 12-19. Создание приемного сокета. Создается новый приемный сокет путем вызова метода IO::Socket::INET->new() с параметрами LocalPort и Listen. Указан также параметр Proto, равный “tcp” и установлено истинное значение параметра Reuse, что позволяет уничтожать и перезапускать сервер без ожидания освобождения порта, которое в ином случае было бы неизбежным.
Кроме этих стандартных параметров, объявлен параметр Timeout равный 1 часу. Как и в инвертирующем эхосервере, приведенном ранее, это сделано для того, чтобы иметь возможность прерывать выполнение функции accept() по сигналу. Необходимо обеспечить выполнение преждевременного возврата функции accept () при прерывании по сигналу INT, чтобы можно было проверить состояние переменной $quit.