URI->new
создает экземпляры подкласса URI
, в зависимости от схемы URL, который вы ему даете.Эти подклассы могут быть URI::http
, URI::file
, URI::mailto
или что-то совершенно другое.Если URI не имеет специализированного подкласса для того типа URL, который вы ему дали, он создаст экземпляр URI::_generic
.
Каждый из этих подклассов URI имеет разные методы.У URI::http
есть метод host
, но у большинства других его нет.Вы вызываете ->host
для чего-то, что не является URI::http
или подобным, и поэтому не имеет метода host
.
Вы, вероятно, ожидали, что все строки, которые вы передаете URI->new
быть http URL.Похоже, это не так, поэтому вы можете проверить свои данные.В противном случае, если вы хотите обрабатывать URL-адреса, отличные от http, вы должны убедиться, что метод действительно существует для этого экземпляра, прежде чем вызывать его, например, с помощью ->can
или ->isa
.