Почему URI Perl жалуется на "Не удается найти метод объекта" host "через пакет" URI :: _ generic "'? - PullRequest
2 голосов
/ 21 сентября 2010

Привет, я пытаюсь получить хост из URL.

sub scrape {
my @m_error_array;
my @m_href_array;
my @href_array;
my ( $self, $DBhost, $DBuser, $DBpass, $DBname ) = @_;
my ($dbh, $query, $result, $array);
my $DNS = "dbi:mysql:$DBname:$DBhost:3306";
$dbh = DBI->connect($DNS, $DBuser, $DBpass ) or die $DBI::errstr;
if( defined( $self->{_process_image} ) && ( -e 'href_w_' . $self->{_process_image} . ".txt" ) ) {
    open  ERROR_W, "error_w_" . $self->{_process_image} . ".txt";
    open  M_HREF_W, "m_href_w_" . $self->{_process_image} . ".txt";
    open  HREF_W, "href_w_" . $self->{_process_image} . ".txt";
    @m_error_array = ( split( '|||', <ERROR_W> ) );
    @m_href_array = ( split( '|||', <M_HREF_W> ) );
    @href_array = ( split( '|||', <HREF_W> ) );
    close ( ERROR_W );
    close ( M_HREF_W );
    close ( HREF_W );
}else{
    @href_array = ( $self->{_url} );
}
my $z = 0;
while( @href_array ){
    if( defined( $self->{_x_more} ) && $z == $self->{_x_more} ) {
        last;
    }
    if( defined( $self->{_process_image} ) ) {
        $self->write( 'm_href_w', @m_href_array );
        $self->write( 'href_w', @href_array );
        $self->write( 'error_w', @m_error_array );
    }
    $self->{_link_count} = scalar @m_href_array;
    my $href = shift( @href_array );
    my $info = URI->new($href);
    my $host = $info->host;
    $host =~ s/^www\.//;
    $result = $dbh->prepare("INSERT INTO `". $host ."` (URL) VALUES ('$href')");
    if( ! $result->execute() ){
        $result = $dbh->prepare("CREATE TABLE `" . $host . "` ( `ID` INT( 255 ) NOT NULL AUTO_INCREMENT , `URL` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `ID` )) ENGINE = MYISAM ;");
        $result->execute()
    }
    $self->{_current_page} = $href;
    my $response = $ua->get($href);
    my $responseCode = $response->code;
    print $responseCode;
}

}

В конце строки my $host = $info->host; выбрасывает Can't locate object method "host" via package "URI::_generic"

Кто-нибудь может объяснить это?

С уважением,

Фил

Ответы [ 2 ]

10 голосов
/ 21 сентября 2010

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.

1 голос
/ 22 октября 2014

Другими словами - URI пытается угадать схему, и если URL имеет неправильный формат, будет схема, которая не имеет этих методов.

Все, что вам нужно, это чек что-то вроде:

if($uri->scheme ne 'http'){
    die "URL '$url' was not http\n";
}
Схема

будет там, даже если она не нашла схему. Это просто не будет иметь значения.

...