5

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

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

因为 URI 对象是 type URI::_generic,并且没有 host() 属性。

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

4

2 回答 2

13

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

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

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

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

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

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

于 2009-09-29T22:16:06.953 回答
4

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

  • $obj->can( METHOD ),用于确定 $obj 类上是否可以使用 METHOD (或者您可以使用裸类名而不是祝福对象 - 用于鸭子类型

  • $obj->isa( TYPE ),用于确定 $obj 是 TYPE 类型还是从 TYPE 继承(本质上,检查 ref($obj) 是否在 TYPE 的 @ISA 数组中)(也允许裸类名)- 用于一些多态实现

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

于 2009-09-30T03:08:21.670 回答