Строки 22,23. Начало главного цикла. Программа входит в главный цикл ввода-вывода. В отличие от предыдущих версий клиента gab, при получении признака конца файла EOF во время чтения из подключенного сокета нельзя сразу же завершить работу. Это связано с тем, что в объекте сеанса сокета или дескриптора stdout могут все еще находиться данные, поставленные в очередь для ожидания, когда дескриптор файла будет готов для записи. Завершение работы выполняется только после того, как все данные, поставленные в очередь дли передачи в дескриптор stdout и в сокет, будут очищены и объект IO::SessionSet удалит дескриптор stdout и сокет из контролируемого набора. Это можно определить, вызвав метод $set->sessions. Если он возвратит значение undef, это значит, что все данные, стоящие в очереди были отправлены и соответствующие сеансы удалены из набора сеансов SessionSet.
Строка 24. Вызов метода wait (). Вызывается метод $set->wait () для перехода в состояние ожидания готовности объектов сеансов для чтения. Этот метод обслуживает также запросы на запись данных, ожидающих обработки. После возврата управления из метода wait () объекты сеансов, готовые для чтения, сохраняются в массиве.
Строки 25-35. Выполнение ввода-вывода в объектах сеансов. Выполняется цикл по всем объектам сеансов, готовым для чтения. Если в их число входит сокет, из него считываются данные и записываются в стандартный вывод. Если в процессе чтения будет получен признак конца файла EOF, с помощью метода close ( ) закрывается этот сокет, а также дескриптор файлов стандартного ввода и вывода.