2009-09-29 12 views
5

Przejmuję listę linków na stronie, tworząc obiekt URI dla każdej z nich. Gdy obiekt URI jest tworzony, nie wiem, czy adres URL ma schematu, więc kiedy później zadzwonić $uri->host(), będę czasamiJak mogę sprawdzić, czy mogę wywołać host() na obiekcie URI w Perlu?

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

ponieważ obiekt URI jest typu URI::_generic, i nie robi nie ma atrybutu host().

Mogłem sprawdzić przed utworzeniem obiektu za pomocą wyrażenia regularnego, lub mogłem owinąć wywołanie $uri->host() w bloku eval, aby obsłużyć wyjątek, ale sądzę, że musi istnieć bardziej odpowiednia metoda niż jedna z nich.

Odpowiedz

13

Moja sugestia: użyj wbudowanych funkcji językowych na swoją korzyść przed wyrażeniem regularnym.

Zamiast regex, można to zrobić:

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

... aby sprawdzić, czy jest ona dostępna. Możesz również sprawdzić jego typ:

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

... i sprawdź, czy masz taki, który jest dobry.

+1

Nigdy nie wiedziałem o metodzie -> can() dla obiektów, dzięki! –

+0

Masz niezrównane połączenie "in your say()". – Ether

4

Klasa UNIVERSAL (perldoc UNIVERSAL) jest rzeczywiście przydatna; zawiera:

  • $obj->can(METHOD), dla określenia czy metoda jest dostępna w klasie $ obj (lub można skorzystać z gołą classname zamiast błogosławiony obiektu - wykorzystywany duck typing

  • $obj->isa(TYPE), dla określenia! jeśli $ obj jest typu TYPE lub pochodzi od typu (zasadniczo sprawdza, czy ref ($ obj) jest w @ISA tablicy TYP za) (gołe classname dozwolone również) - stosowane do niektórych polimorficznych wdrożeń

  • VERSION, dla coraz ciąg wersji modułu (boorrrrring)

Powiązane problemy