2009-09-29 50 views
5

我遍歷頁面上的鏈接列表,爲每個鏈接創建一個URI對象。在創建URI對象,我不知道URL是否有一個計劃,所以當我後來打電話$uri->host(),我有時會得到如何檢查我是否可以在Perl中的URI對象上調用host()?

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

因爲URI對象是URI::_generic型的,和沒有按沒有host()屬性。

我可以在使用正則表達式創建對象之前進行檢查,或者我可以將$uri->host()調用包裝在eval塊中以處理異常,但是我認爲必須比這兩者中的任何一個更加和藹可親。

回答

13

我的建議:在正則表達式之前使用內置的語言功能。

而不是一個正則表達式,你可以這樣做:

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

...去看看它是否可用。你也可以檢查它的類型:

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

...並驗證你有一個很好。

+1

我從來不知道 - > can()方法的對象,謝謝! – 2009-09-29 22:49:42

+0

在你的say()調用中你有一個無與倫比的'。 – Ether 2009-09-29 23:12:05

4

UNIVERSAL類(perldoc UNIVERSAL)確實非常有用;它包含:

  • $obj->can(METHOD),用於確定方法可在$ OBJ類(或者你可以使用裸類名,而不是一個幸福的對象 - 用於duck typing

  • $obj->isa(TYPE),決定!如果$ obj是TYPE類型或是TYPE的後代(實質上,檢查ref($ obj)是否在TYPE的@ISA數組中)(用於一些多態實現) - 用於某些多態實現

  • VERSION,模塊的版本字符串(boorrrrring)

相關問題