我正在遍历页面上的链接列表,为每个链接创建一个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
块中以处理异常,但我认为必须有一个更为温和的方法。那些。
答案 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!
$obj->isa( TYPE )
,用于确定$ obj是TYPE的类型还是TYPE的后代(实际上,检查ref($ obj)是否在TYPE的@ISA数组中)(也允许裸类名) - 使用对于某些多态实现
VERSION
,获取模块的版本字符串(boorrrrring)