2009-09-29 14 views
5

Estoy iterando a través de una lista de enlaces en una página, creando un objeto URI para cada uno. Cuando se crea el objeto URI, no sé si el URL tiene un esquema, por lo que cuando más tarde me llamo $uri->host(), voy a conseguir a veces¿Cómo puedo verificar si puedo llamar a host() en un objeto URI en Perl?

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

porque el objeto URI es del tipo URI::_generic, y doesn no tiene un atributo de host()

Pude comprobar antes de la creación del objeto con expresiones regulares, o pude ajustar la llamada $uri->host() en un bloque eval para manejar la excepción, pero creo que tiene que haber un método más suave que cualquiera de los dos.

Respuesta

13

Mi sugerencia: utilice las funciones integradas del lenguaje para su ventaja antes de una expresión regular.

En lugar de una expresión regular, usted puede hacer esto:

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

... a ver si está disponible. También puede verificar su tipo:

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

... y verificar que tiene uno que sea bueno.

+1

Nunca supe del método -> can() para objetos, gracias! –

+0

Tiene una llamada inigualable 'in your say()'. – Ether

4

La clase UNIVERSAL (perldoc UNIVERSAL) es bastante útil; que contiene:

  • $obj->can(METHOD), para determinar si el método está disponible en la clase $ obj (o puede utilizar un nombre de clase desnuda en lugar de un objeto bendito - se utiliza para duck typing

  • $obj->isa(TYPE), para determinar! si $ obj es tipo tIPO o desciende de tipo (esencialmente, comprueba si ref ($ obj) es en array @ISA de tIPO) (nombre de clase desnudo también permitió) - utilizados para algunas implementaciones polimórficas

  • VERSION, para obtener una cadena de versión del módulo (boorrrrring)

Cuestiones relacionadas