perl - 为什么Perl的URI提示“无法通过包URI::_ generic找到对象方法” host”?

标签 perl uri host

嗨,我正在尝试从网址获取主机。

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"

有人可以解释吗?

问候,

菲尔

最佳答案

URI->new根据您提供的url的方案创建URI子类的实例。这些子类可能是URI::httpURI::fileURI::mailto或完全不同的东西。如果URI没有针对您提供的url类型的专门子类,它将创建URI::_generic的实例。

这些URI子类中的每一个都有不同的方法。 URI::http碰巧有一个host方法,但大多数其他方法却没有。您正在非->host或类似名称的对象上调用URI::http,因此没有host方法。

您可能希望传递给URI->new的所有字符串都是http url。似乎并非如此,因此您可能需要检查数据。否则,如果您确实要处理非HTTP URL,则应确保在调用该实例之前确实存在该实例的方法,例如使用->can->isa

关于perl - 为什么Perl的URI提示“无法通过包URI::_ generic找到对象方法” host”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3757359/

相关文章:

java.net.URI.relativize 不适用于 JAR URI

mysql - mysql.user 表中的 127.0.0.1、localhost、[hostname] 有什么区别

javascript - 开启jquery?

matplotlib - 如何更改多个轴标签的字体大小(使用 host_subplot API 创建)

无法在cgi中执行外部命令

perl - 带有共享符号的安全隔间会导致 Perl 调试器发出嘶嘶声

perl - 如何确定使用Perl将计算机设置为当前时区?

linux - 从 perl 更改 PATH

java - 从外部存储打开图像

java - Android从捕获的图像中获取图像路径