2009-09-29 8 views
5

Ich durchläuft eine Liste von Links auf einer Seite und erstelle jeweils ein URI-Objekt. Wenn das URI-Objekt erstellt wird, weiß ich nicht, ob die URL ein System hat, so, wenn ich $uri->host() später anrufen, werde ich manchmalWie kann ich überprüfen, ob ich Host() für ein URI-Objekt in Perl aufrufen kann?

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

erhalten, weil das URI-Objekt vom Typ URI::_generic und doesn Habe kein Host() -Attribut.

Ich könnte vor der Objekterstellung mit Regex überprüfen, oder ich könnte den $uri->host() Aufruf in einen eval-Block um die Ausnahme behandeln, aber ich denke, es muss eine suave Methode als beide von denen sein.

Antwort

13

Mein Vorschlag: Verwenden Sie die eingebauten Sprachfunktionen zu Ihrem Vorteil vor einer Regex.

Statt einer Regex, können Sie dies tun:

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

... um zu sehen, wenn es verfügbar ist. Sie könnten auch überprüfen, es ist Typ:

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

... und verifizieren, dass Sie eine, die gut ist.

+1

Ich wusste nicht einmal über die -> can() -Methode für Objekte, danke! –

+0

Sie haben einen unübertroffenen Anruf in Ihrem say(). – Ether

4

Die UNIVERSAL-Klasse (perldoc UNIVERSAL) ist in der Tat ziemlich nützlich; es enthält:

  • $obj->can(METHOD), zur Bestimmung, ob Methode auf dem $ obj Klasse verfügbar ist (oder Sie können mit einem nackten Klassennamen anstatt ein gesegnetes Objekt verwenden - für duck typing

  • $obj->isa(TYPE), verwendet für die Bestimmung! wenn $ obj ist TYPE-Typ oder vom Typ abstammen (im wesentlichen überprüft, ob ref ($ obj) @ISA Arrays in TYPE) (nackten Klassennamen auch erlaubt) - für einige polymorphe Implementierungen verwendet

  • VERSION, für eine immer Versionszeichenfolge des Moduls (boorrrrring)

Verwandte Themen