我有一个类似" www.google.com/aabc/xyz"的网址。我如何从中获取主机名?我用了这段代码:
my $referer = URI->new('www.google.com/aabc/xyz');
my $host = $referer->host; //compiler error
我在第二行遇到错误。
答案 0 :(得分:1)
use URI;
use URI::Heuristic qw(uf_uristr);
my $referrer = URI->new( uf_uristr('www.google.com/aabc/xyz') );
print $referrer->host;
答案 1 :(得分:0)
自从我删除第一个答案后,问题发生了重大变化。有足够高的rep你可以看到它。
你有代码(最好发布完整的程序):
my $referer = URI->new('www.google.com/aabc/xyz');
my $host = $referer->host; //compiler error
你说你得到了一个编译器错误,但它确实是一个运行时错误:
Can't locate object method "host" via package "URI::_generic"
当您创建新对象时,您给了URI一个字符串。从那以后,它会猜测它是什么类型的URI。由于在它前面没有诸如http://
之类的方案,因此它不会猜测它是那种URI。相反,它会回归到“通用”类URI::_generic。由于其名称中的下划线以及没有文档的事实,您可能会猜测它并不意味着您需要了解。
但是,这是抱怨。它认为URI是一个路径(以及其他一些东西)。您认为是作为路径解析的主机的部分:
use v5.10;
use URI;
my $referer = URI->new('www.google.com/aabc/xyz');
my $path = $referer->path;
say "path is $path";
现在你看到它做了什么:
path is www.google.com/aabc/xyz
通用URI对主机一无所知,因此当您在其对象上调用host
时,它会爆炸。或许它可以更好地返回undef,但这不是它的作用。
oanders已经有一个interesting answer that guesses for you来填写方案,当它认为可能会丢失时,但还有另一件事你可以做。在调用主机之前,请检查对象是否可以响应它:
use v5.10;
use URI;
my $url = 'www.google.com/aabc/xyz';
my $referer = URI->new( $url );
if( $referer->can( 'host' ) ) {
say "Host is " . $referer->host;
}
else {
say "Weird hostless URL: $referer";
}
现在你的程序不应该因为同样的原因而爆炸,你可以查看输出以发现你无法处理的字符串。