2009-09-29 10 views
5

私は、ページ上のリンクのリストを繰り返し、それぞれのURIオブジェクトを作成しています。 URIオブジェクトが作成されると、私はURLスキームを持っているかどうかわからないので、私は後で$uri->host()を呼び出すときにURIオブジェクトがタイプURI::_genericであるため、私は時々PerlのURIオブジェクトに対してhost()を呼び出せるかどうかを確認するにはどうすればよいですか?

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

を取得します、とのdoesn host()属性を持っていません。

正規表現を使ってオブジェクトを作成する前にチェックするか、$uri->host()コールをevalブロックでラップして例外を処理することができますが、どちらかの方法よりも優れた方法が必要です。

答えて

13

私の提案:正規表現の前に、組み込みの言語機能を利用することをお勧めします。代わりに、正規表現の

、あなたはこれを行うことができます。それが利用可能かどう

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

は...見て。また、タイプを確認することもできます:

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

...あなたが良いものであることを確認してください。

+1

私は決してオブジェクトについて - > can()メソッドについて知りませんでした。ありがとう! –

+0

あなたのsay()呼び出しで比類のない 'があります。 – Ether

4

UNIVERSALクラス(perldoc UNIVERSAL)は確かに非常に便利です。それは含まれています:

  • $obj->can(METHOD)、METHODが$ OBJクラスで提供されています(または、あなたが裸のクラス名ではなく、祝福されたオブジェクトを使用できるかどうかを決定するために - 決定するために、duck typingに使用

  • $obj->isa(TYPE)を!もし$ objがタイプTYPEであるか、(裸のクラス名でも可)(refは($ OBJ)TYPEの@ISA配列である場合、基本的に、小切手)TYPEから降りている - 取得するために、いくつかの多型の実装

  • VERSIONに使用しますモジュールのバージョン文字列(boorrrring)

関連する問題