如何检查我是否可以在Perl中的URI对象上调用host()?

时间:2009-09-29 21:39:35

标签: perl uri

我正在遍历页面上的链接列表,为每个链接创建一个URI对象。创建URI对象时,我不知道URL是否有方案,所以当我稍后调用$uri->host()时,我有时会得到

Can't locate object method "host" via package "URI::_generic" at -e line 1.

因为URI对象的类型为URI::_generic,并且没有host()属性。

我可以在使用正则表达式创建对象之前进行检查,或者我可以将$uri->host()调用包装在eval块中以处理异常,但我认为必须有一个更为温和的方法。那些。

2 个答案:

答案 0 :(得分:13)

我的建议:在正则表达式之前使用内置语言功能。

而不是正则表达式,你可以这样做:

if ($uri->can('host')) {
    say "We're good!";
}

......看看它是否可用。您还可以检查它的类型:

if ($uri->isa('URI::_generic')) {
    die 'A generic type - not good!' ;
}

...并确认你有一个好的。

答案 1 :(得分:4)

UNIVERSAL类(perldoc UNIVERSAL)非常有用;它包含:

  • $obj->can( METHOD ),用于确定$ obj类上是否有METHOD(或者您可以使用裸名称而不是受祝福的对象 - 用于duck typing

    < / LI>
  • $obj->isa( TYPE ),用于确定$ obj是TYPE的类型还是TYPE的后代(实际上,检查ref($ obj)是否在TYPE的@ISA数组中)(也允许裸类名) - 使用对于某些多态实现

  • VERSION,获取模块的版本字符串(boorrrrring)