2013-05-18 25 views
6

में ऊपरी-केस वर्ण के साथ शुरू होती है, मुझे पर्ल में एक सबराउटिन बनाने की आवश्यकता है जो यह निर्धारित करता है कि कोई स्ट्रिंग ऊपरी-केस वर्ण से शुरू होती है या नहीं। मेरे पास अब तक निम्न है:निर्धारित करें कि एक स्ट्रिंग पर्ल

sub checkCase { 
    if ($_[0] =~ /^[A-Z]/) { 
     return 1; 
    } 
    else { 
     return 0; 
    } 
} 

$result1 = $checkCase("Hello"); 
$result2 = $checkCase("world"); 
+0

... और? यह कैसे काम नहीं कर रहा है? –

+2

ASCII से अपरकेस अक्षर का मतलब है? या यूनिकोड अपरकेस अक्षर या अपरकेस कोडपॉइंट? – jm666

उत्तर

4

यह लगभग सही है। लेकिन [A-Z] आपके लोकेल के आधार पर अपरकेस उच्चारण वर्णों से मेल नहीं खा सकता है। /^[[:upper:]]/ का उपयोग करने के लिए बेहतर है।

इसके अलावा आपके subroutine invocations में उनके सामने $ वर्ण नहीं होना चाहिए। अर्थात। वे किया जाना चाहिए:

$result1 = checkCase("Hello"); 
$result2 = checkCase("world"); 
+1

* "'$'' नहीं होना चाहिए * * एक अल्पसंख्यक है, यह एक वाक्यविन्यास त्रुटि है। मुझे लगता है कि @ डैन जोन्स का मतलब था 'और उप' शैली का आविष्कार, लेकिन आप सही हैं कि इसका उपयोग नहीं किया जाना चाहिए। – amon

8

आपका कोड जब तक आप अपने सबरूटीन कॉल के सामने से $ हटाने के रूप में ठीक है। एक डॉलर चिह्न स्केलर मान दर्शाता है, और कॉल की तरह

$result1 = checkCase("Hello"); 
$result2 = checkCase("world"); 

आपका सबरूटीन भी है essarily लंबे unnec दिखना चाहिए। रेगेक्स मैच एक सच्चा/झूठा मान देता है, और आप अलग-अलग सत्य/झूठे मान 1 या 0 वापस करने के लिए उस मान का उपयोग कर रहे हैं। रेगेक्स मैच के परिणाम को सीधे वापस करने के लिए बहुत बेहतर है।

अंत में, यदि आप ASCII वर्णों के बाहर काम कर रहे हैं तो आप अपरकेस लेटर यूनिकोड श्रेणी का उपयोग करना चाहेंगे, जो \p{Lu} का उपयोग करके एन्कोड किया गया है।

मुझे आशा है कि आपके कोड पर यह बदलाव उपयोगी होगा। मैंने subroutine का नाम थोड़ा बदल दिया है क्योंकि यह चरम और सबराउटिन पहचानकर्ताओं के लिए केवल निम्न केस अक्षरों और अंडरस्कोर का उपयोग करने के लिए मानक अभ्यास है। ऊपरी केस अक्षरों को पैकेज नामों जैसे ग्लोबल्स के लिए आरक्षित किया जाता है।

sub check_case { 
    $_[0] =~ /^\p{Lu}/ 
} 

print check_case('Hello') ? 'YES' : 'NO', "\n"; 
print check_case('world') ? 'YES' : 'NO', "\n"; 
संबंधित मुद्दे