2010-10-18 31 views
13

मैं पर्ल के लिए बिल्कुल नया हूं। मुझे बाहरी मॉड्यूल HTTP :: BrowserDetect का उपयोग करने की आवश्यकता थी। मैं कुछ कोड का परीक्षण कर रहा था और os_string विधि से ओएस का नाम प्राप्त करने का प्रयास किया। इसलिए, मैंने बस ऑब्जेक्ट को आरंभ किया और लौटाए गए मान को स्टोर करने के लिए एक चर बनाया।मैं पर्ल वैरिएबल के लिए डिफ़ॉल्ट मान कैसे सेट कर सकता हूं?

my $ua = HTTP::BrowserDetect->new($user_agent); 
my $os_name = $ua->os_string(); 

print "$user_agent $os_name\n"; 

कुछ उपयोगकर्ता एजेंट हैं जो ब्राउज़र उपयोगकर्ता एजेंट नहीं हैं इसलिए उन्हें os_string से कोई मूल्य नहीं मिलेगा। मुझे एक त्रुटि मिल रही है Use of uninitialized value $os_name in concatenation (.) or string

$ os_name प्रारंभ नहीं होने पर मैं ऐसे मामलों को कैसे संभाल सकता हूं क्योंकि विधि os_string वापस आती है (यह मुझे लगता है कि मॉड्यूल स्रोत कोड पढ़ने से होता है)। मुझे लगता है कि एक डिफ़ॉल्ट स्ट्रिंग देने का एक तरीका होना चाहिए, उदा। इन मामलों में कोई ओएस नहीं।

उत्तर

17
my $os_name = $ua->os_string() || 'No OS'; 

तो $ua->os_string() falsy है (यानी: undef, शून्य, या खाली स्ट्रिंग), तो || अभिव्यक्ति के दूसरे भाग का मूल्यांकन किया जाएगा (और अभिव्यक्ति के मूल्य हो जाएगा)।

+0

धन्यवाद, यह वास्तव में वास्तव में एक बहुत ही साधारण समस्या थी :)। – sfactor

26

कृपया ध्यान दें: मूल उत्तर का दृष्टिकोण ($var = EXPRESSION || $default_value) अभिव्यक्ति से लौटाए गए किसी भी "पर्ल झूठे मूल्यों" के लिए डिफ़ॉल्ट मान उत्पन्न करेगा, उदा। अगर अभिव्यक्ति एक खाली स्ट्रिंग है, तो आप इसके बजाय डिफ़ॉल्ट मान का उपयोग करेंगे।

आपके विशेष उदाहरण में यह संभवतः सही काम है (ओएस नाम खाली स्ट्रिंग नहीं होना चाहिए), लेकिन सामान्य स्थिति में, यह एक बग हो सकता है, अगर आप वास्तव में केवल डिफ़ॉल्ट मान का उपयोग करना चाहते थे undef का।

आप undef मूल्यों, लेकिन खाली नहीं स्ट्रिंग या शून्य से बचने के लिए केवल चाहते हैं, आप कर सकते हैं:

  • Perl 5.10 और बाद में: का उपयोग करें "परिभाषित या ऑपरेटर" (//):

    my $os_name = $ua->os_string() // 'No OS'; 
    
  • पर्ल 5.8 और पूर्ववर्ती संस्करण:

    : एक सशर्त ऑपरेटर क्योंकि परिभाषित या अभी तक उपलब्ध नहीं था का उपयोग
    my $os_string = $ua->os_string(); # Cache the value to optimize a bit 
    my $os_name = (defined $os_string) ? $os_string : 'No OS'; 
    # ... or, un-optimized version (sometimes more readable but rarely) 
    my $os_name = (defined $ua->os_string()) ? $ua->os_string() : 'No OS'; 
    

एक बहुत अधिक गहराई (// बारे में विवरण सहित) विषय पर नज़र ब्रायन डी Foy की पोस्ट यहाँ हैं: http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

+1

मैंने हाल ही में '||' दृष्टिकोण का उपयोग करके अपने कोड में एक बग पेश किया। इस पोस्ट से पहले इस मुद्दे को मिला लेकिन "परिभाषित-या" ऑपरेटर के बारे में नहीं पता था। हर दिन पर्ल के साथ कुछ नया सीखें। – ThisSuitIsBlackNot

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

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