5

ページ上のリンクのリストを反復処理して、それぞれの 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ブロックでラップして例外を処理することもできますが、これらのいずれよりも適切な方法が必要であると考えています。

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 に答える