2009-09-29 8 views
5

Sto iterando attraverso un elenco di collegamenti su una pagina, creando un oggetto URI per ciascuno. Quando viene creato l'oggetto URI, non so se l'URL ha uno schema, così quando ho poi chiamo $uri->host(), io a volte ottenereCome posso verificare se posso chiamare host() su un oggetto URI in Perl?

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

perché l'oggetto URI è di tipo URI::_generic, e doesn avere un attributo host()

Potrei controllare prima della creazione dell'oggetto con espressioni regolari, oppure potrei avvolgere la chiamata $uri->host() in un blocco eval per gestire l'eccezione, ma immagino che ci debba essere un metodo più soave rispetto a uno di questi.

risposta

13

Il mio suggerimento: utilizzare le funzionalità del linguaggio integrate a proprio vantaggio prima di un'espressione regolare.

Invece di una regex, si può fare questo:

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

... per vedere se è disponibile. Puoi anche controllare il tipo:

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

... e verificare che ne hai una buona.

+1

Non ho mai nemmeno saputo del metodo -> can() per gli oggetti, grazie! –

+0

Hai una risposta ineguagliata nella tua say(). – Ether

4

La classe UNIVERSAL (perldoc UNIVERSAL) è piuttosto utile; contiene:

  • $obj->can(METHOD), per determinare se il metodo è disponibile sulla classe $ obj (oppure è possibile utilizzare un nome di classe nuda piuttosto che un oggetto benedetto - usato per duck typing

  • $obj->isa(TYPE), per la determinazione! se $ obj è type tipo o discende da tIPO (in sostanza, controlla se ref ($ obj) è in serie @ISA di TYPE) (classname nudo anche consentito) - utilizzati per alcune implementazioni polimorfici

  • VERSION, per ottenere un stringa di versione del modulo (boorrrrring)

Problemi correlati