Эти операции реализованы таким образом, что чтение никогда не блокируется, и это исключает вероятность того, что медленный сервер задержит выполнение всех остальных операций.
Вызов метода read () возвращает истинное значение, если было успешно выполнено чтение из сокета, или ложное значение, если возникла ошибка чтения или достигнут конец файла. В последнем случае работа с сокетом закончена, поэтому он удаляется из набора $readers и хеша % connections.
Строка 31. Завершающие действия. Выполнение цикла заканчивается, если в наборах $readers или $writers не осталось больше ни одного дескриптора. Это проверяется путем вызова методов count () соответствующих объектов IO::Select.
Теперь рассмотрим модуль HTTPFetch, в котором реализована, основная часть функциональных средств этой программы.
Строки 1-7. Загрузка модулей. Выполнение кода модуля начинается с вызова модулей IO::Socket, IO::File и Carp. Импортируется также константа einprogress из модуля Errno и выполняется загрузка модулей File::Path и File::Basename. Эти модули импортируют функции mkpath () и dirname (), которые применяются для создания пути доступе к локальной копии загруженного файла.
Строки 8-31. Конструктор new(). Метод new() создает объект HTTPFetch. Его единственным параметром является URL, по которому должна быть выполнена выборка информации. Выполнение метода начинается с интерпретации URL и выделения частей с указанием хоста, порта и пути, для чего применяется внутренняя процедура parse_url(). Если интерпретация URL не может быть выполнена, то вызывается внутренний метод error (), который отправляет сообщение об ошибке в дескриптор stderr и возвращает значение undef .