Однако на этот раз обработчик urg устанавливает также локальную переменную $abort равной истинному значению. В цикле вызывается метод pretty_text () объекта Text::Travesty для генерации вплоть до 500 слов, символы обозначения конца строки заменяются последовательностью crlf и выполняется запись полученного текста. В конце цикла передается строка, состоящая из одной точки.
Если передача была прервана аварийно, необходимо сообщить клиенту, чтобы он отбросил данные, оставшиеся в потоке сокета. Это действие выполняется путем отправки клиенту байта срочных данных с использованием следующей общей схемы.
if ($abort) {
warn "make_travesty() abortedn" if DEBUG;
$gl->send('!',MSG_OOB);
}}
Снова отметим, что метод send() передается модулем IO::Getline основополагающему объекту IO:: Socket.
Строки 89-93. Подпрограмма reset_travesty(). Эта подпрограмма вызывает метод reset () объекта Text::Travesty и передает сообщение с подтверждением, что таблица частоты слов была очищена.
Строки 94-108. Обработчик сигнала do_urgent (). Обработчик сигнала do_urgent () отвечает за очистку внутреннего буфера чтения при получении байта срочных данных. Выполняется выборка сокета из глобального объекта Ю::Getline и вызов функции sysread() в непрерываемом цикле до тех пор, пока метод atmark () сокета не вернет истинное значение. В результате будут отброшены все данные, вплоть до байта срочных данных.
Затем вызывается функция recv () для чтения самих срочных данных. В этом приложении содержимое срочных данных не имеет особого значения, поэтому оно игнорируется. После этого производится очистка всех оставшихся данных во внутреннем буфере объекта IO::Getline путем вызова его метода flush ().