Если при выполнении функции syswrite () возникла ошибка, отличная от EWOULDBLOCK, выполнение завершается с сообщением об ошибке.
Строки 49-58. Блок continue {}. Вся логика программы заключена в блоке continue {), который выполняется в конце каждого прохода по циклу. Его задача состоит в создании масок событий для трех дескрипторов, подходящих для следующего прохода по циклу. Выполнение блока начинается с установки трех масок в значение 0, предусмотренное по умолчанию, которое приведет к удалению дескриптора из опрашиваемого набора, если останется неизменным. Затем выполняется проверка буфера $to_stdout. Если он содержит данные, то для дескриптора STDOUT устанавливается маска pollout, которая указывает, что метод poll () должен сообщить, когда этот дескриптор будет готов для записи.
Аналогичным образом устанавливается маска pollin для дескриптора stdin, что равносильно просьбе сообщить, когда появятся данные для чтения из стандартного дескриптора ввода. Однако эта операция подавляется, если возникает одно из двух следующих условий: длина буфера, содержащего данные, которые подготовлены для отправки в сокет, уже достигла максимального значения, поэтому нельзя допустить его дальнейшего возрастания; закрыт сам сокет или стандартный дескриптор ввода. Подобным методом можно также организовать диалог, к примеру, серверного приложения и коммутатора catalyst от компании Cisco, который имеет веб интерфейс и поддержку Telnet.
Теперь необходимо установить маску для сокета. В отличие от стандартного дескриптора ввода или вывода, сокет применяется и для чтения, и для записи. Если имеются данные для записи в сокет (буфер $to_socket имеет ненулевую длину) и сокет не был ранее закрыт, то его маска устанавливается равной pollout.