2009-09-29 17 views
5

मैं एक पृष्ठ पर लिंक की एक सूची के माध्यम से पुनरावृत्ति कर रहा हूं, प्रत्येक के लिए एक यूआरआई वस्तु बना रहा हूं। जब यूआरआई वस्तु बन जाता है, मैं URL एक स्कीम है या नहीं पता नहीं है, इसलिए जब मैं बाद में $uri->host() कहते हैं, मैं कभी कभीमैं कैसे जांच सकता हूं कि क्या मैं पर्ल में एक यूआरआई ऑब्जेक्ट पर होस्ट() को कॉल कर सकता हूं?

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

मिल जाएगा क्योंकि यूआरआई ऑब्जेक्ट प्रकार URI::_generic की है, और नहीं करता है एक होस्ट() विशेषता नहीं है।

मैं regex के साथ ऑब्जेक्ट निर्माण से पहले की जांच कर सकता है, या मैं अपवाद को संभालने के लिए एक eval ब्लॉक में $uri->host() कॉल लपेट सकता है, लेकिन मैं समझ वहाँ उन दोनों में से किसी की तुलना में अधिक सौम्य विधि हो गया है।

उत्तर

13

मेरा सुझाव: रेगेक्स से पहले आपके लाभ में निर्मित भाषा सुविधाओं का उपयोग करें।

एक regex के बजाय

, तो आप ऐसा कर सकते हैं:

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

... अगर यह उपलब्ध है देखने के लिए। आप इसे भी टाइप कर सकते हैं:

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

... और सत्यापित करें कि आपके पास यह अच्छा है।

+1

मैं कभी भी बारे में पता था -> कर सकते हैं() वस्तुओं के लिए विधि है, धन्यवाद! –

+0

आपको अपने कहना() कॉल में एक बेजोड़ है। – Ether

4

यूनिवर्सल क्लास (perldoc UNIVERSAL) वास्तव में बहुत उपयोगी है; यह शामिल हैं:

  • $obj->can(METHOD), यह निर्धारित करने विधि $ obj वर्ग पर उपलब्ध है के लिए (या आप के बजाय एक नंगे classname एक धन्य वस्तु का उपयोग कर सकते हैं - निर्धारित करने के लिए duck typing के लिए इस्तेमाल किया

  • $obj->isa(TYPE),! यदि $ obj प्रकार, TYPE है या प्रकार का वंशज है (अनिवार्य रूप से इसकी जांच करता है रेफरी ($ obj) प्रकार के @ISA सरणी में है) (नंगे classname भी अनुमति दी) -, कुछ बहुरूपी कार्यान्वयन

  • VERSION के लिए इस्तेमाल एक प्राप्त करने के लिए मॉड्यूल के संस्करण स्ट्रिंग (Boorrrrring)

संबंधित मुद्दे