Строки 20, 21. Прием входящих соединений. Теперь сценарий входит в цикл while (). При каждом проходе по циклу вызывается функция accept () для получения объекта IO::Socket подключенного к новому клиенту.
Строки 22-27. Ветвление: запуск дочернего процесса для обработки соединения. После возврата управления функцией accept ( ) не происходит переход непосредственно к взаимодействию по подключенному сокету, а немедленно вызывается функция fork () и код результата сохраняется в переменной $child. Если значение переменной $child является неопределенным, это значит, что вызов функции fork() по какой-то причине окончился неудачей, поэтому вызывается функция die с сообщением об ошибке.
В ином случае, если значение переменной $child равно 0, это значит, что управление передано дочернему процессу, который отвечает за выполнение сеанса связи. Дочерний процесс не должен снова вызывать функцию accept (), поэтому принадлежащая ему копия приемного сокета закрывается. Строго говоря, эта операция закрытия не является необходимой. Однако всегда рекомендуется освобождать все ненужные ресурсы, к тому же, это позволяет исключить возможность непреднамеренного выполнения дочерним процессом операций с приемным сокетом.
Теперь вызывается подпрограмма interact () , которой передается подключенный объект сокета; сама подпрограмма ведет диалог с программой Eliza и выполняет возврат, когда пользователь разрывает соединение (например, введя строку “bye”). После возврата из подпрограммы interact () дочерний процесс завершает свою работу путем вызова функции exit ().