如何从Perl中的URL获取主机名?

时间:2015-09-09 07:24:55

标签: regex perl

我有一个类似" www.google.com/aabc/xyz"的网址。我如何从中获取主机名?我用了这段代码:

 my $referer = URI->new('www.google.com/aabc/xyz');
 my $host    = $referer->host; //compiler error

我在第二行遇到错误。

2 个答案:

答案 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";
    }

现在你的程序不应该因为同样的原因而爆炸,你可以查看输出以发现你无法处理的字符串。