2009-11-17 12 views
12

मैं सिर्फ पर्ल (शाब्दिक रूप से आज) के साथ शुरू कर रहा हूं और मैं Beginning Perl का मुफ्त ऑनलाइन संस्करण पढ़ रहा हूं। प्रारंभ में, पुस्तक ने उल्लेख किया कि डबल उद्धृत तारों को अलग किया जाएगा। हालांकि, प्रिंट फ़ंक्शन का उपयोग करके प्रत्येक उदाहरण में (अब तक ... मैं पृष्ठ 66 के आसपास हूं), लेखक सूची पैरामीटर के रूप में स्केलर वैरिएबल पास कर रहा है। हो सकता है कि मैं बंदूक कूद रहा हूं और इसे बाद में समझाया जाएगा, लेकिन विधि ए पर विधि ए चुनने का कोई कारण है?क्या पर्ल में इंटरपोलेशन में कोई कमी है?

विधि एक:

$myVar = "value"; 
print "Current value is ", $myVar, "\n"; 

विधि बी:

$myVar = "value"; 
print "Current value is $myVar\n"; 

मेरी राय में, विधि बी और अधिक सुविधाजनक है। क्या समुदाय में कोई पसंदीदा तरीका है? या हो सकता है कि कुछ छिपे हुए गठिया जो एक विधि को अन्य आदि पर उपयोग करने के लिए सुरक्षित बनाते हैं?

TIA

उत्तर

12

इस तरह के एक साधारण उदाहरण में, नहीं .. लेकिन विचार करें कि $myVar वास्तव में कुछ अधिक जटिल था, जैसे कि हैश संदर्भ का गहरा समर्पण, या एक विधि कॉल। कुछ चीजें स्ट्रिंग्स के अंदर इंटरपोलेट करती हैं (अधिकांश ऑब्जेक्ट संदर्भ करते हैं), लेकिन विधि कॉल नहीं करते हैं। स्ट्रिंग में इंटरपोलेटेड बनाम सीधे मुद्रित होने पर भी सरणी अलग-अलग चीजें करते हैं।

पीएस। पर्ल में आपका स्वागत है; कृपया यात्रा का आनंद लें! :)

1

(यह शायद होना चाहिए समुदाय विकि।)

केवल स्पष्ट मुद्दा यह है कि मेरे दिमाग में आता है सरणियों के प्रक्षेप है।

print @arr, "\n"; 

तुलना करें

print "@arr\n"; 

इसके अलावा के साथ, कभी कभी अपसंदर्भन प्रक्षेप के साथ अच्छी तरह से काम नहीं करते जटिल, लेकिन उन तरह के दुर्लभ हैं।

+0

मैं इसे विकी के रूप में चिह्नित करूंगा। –

2

यदि आप पर्ल तक पहुंच रहे हैं, तो आप चीजों को पूरा करने का सबसे तेज़ तरीका ढूंढ रहे हैं। आपको इसके अलावा, इस तरह से ऐसा करने के लिए प्रोत्साहित किया जाता है जो आपके सोचने की तरह है (इसलिए पर्ल आदर्श वाक्य: टीएमटीओटीटीआईआई, ऐसा करने के लिए एक तरीका है)। इसलिए: आपके लिए लिखने के लिए जो भी रास्ता आसान है, जब भी आप बाद में कोड पर वापस आते हैं, तो आपको जिस तरह से समझने की संभावना है, वैसे ही आपको यह करना चाहिए (अन्य सभी चीजें, जैसे कि इच्छित परिणाम देना, बराबर होना)।

यदि आप सुझाव देते हैं, तो आप "सुरक्षा" के बारे में चिंतित हैं, तो tainting के बारे में जानें, जो आपको बाहरी दुनिया से संभावित रूप से शरारती डेटा से बचाने में मदद करता है।

4

विधि एक होना चाहिए:

$myVar = "value"; 
print 'Current value is ', $myVar, "\n"; 

जब आप एकल उद्धरण एक स्ट्रिंग, पर्ल पूरी बात चीजों को जोड़ की तलाश के लिए पढ़ने परेशान नहीं करता है, तो आप एक लंबी स्ट्रिंग है कि नहीं करता है, तो इंटरपोलेशन की आवश्यकता नहीं है, यह सिंगल कोट्स का उपयोग करने के लिए तेज़ हो सकता है और ऊपर की तरह गतिशील भागों को जोड़ सकता है।

हालांकि, यह एक माइक्रो-अनुकूलन है जो वास्तव में एक बड़ा अंतर नहीं बनाता है।

विधि एक प्रयोग करने के लिए एक और मामला स्ट्रिंग अक्षर हैं जो आप से बचने के परेशान करने के लिए नहीं करना चाहती बच शामिल करता है, तो यह है:

$myVar = 12000; 
print 'Conversion from $US to $CND: ', $myVar,\n"; 

इस मामले में, आप पर्ल $US देखने के लिए नहीं करना चाहते हैं और $CND चर, आप चाहते हैं कि स्ट्रिंग में डॉलर का चिह्न हो।

अंत में, यह ज्यादातर शैली का विषय है। मैं आमतौर पर डबल-उद्धृत तारों से बचने की कोशिश करता हूं जब तक कि मुझे उनकी आवश्यकता न हो।

+0

प्रिंट "x", $ y, "z" वास्तव में प्रिंट "x" से अलग है। $ वाई कंपाइलर जाने के बाद "z" प्रिंट "x $ {y} z" जैसा ही है। पहला संस्करण मुद्रित करने के लिए तीन तर्क पारित कर रहा है। दो अन्य सिर्फ एक पास करते हैं। लेकिन आप सही हैं: प्रभावी रूप से, यह किसी भी स्थिति में कोई फर्क नहीं पड़ता है। – tsee

+0

लगभग ... यदि $ सेट है, तो यह वही नहीं हो सकता है। लेकिन ज्यादातर लोग $ के साथ गड़बड़ नहीं करते हैं, वैसे भी। :) –

0

एक पर्ल बाहरी व्यक्ति के रूप में जो किसी भी पर्ल-विशिष्ट संपादकों और उनकी हाइलाइटिंग शक्तियों से परिचित नहीं है, मैं जब भी संभव हो एकल कोट्स का उपयोग करने के लिए वोट देता हूं। इससे पाठक को यह स्पष्ट हो जाता है कि इस स्ट्रिंग में कुछ भी नहीं है जिसे किसी भी तरह से अलग किया जाएगा।

+0

कई क्रॉस-भाषा आईडीई और संपादक पर्ल को हाइलाइट करेंगे। पूर्व के लिए, किसी भी Scintilla- आधारित। –

+2

मैं विम में सिंटैक्स हाइलाइटिंग का उपयोग करता हूं और मैं अभी भी लगभग हर जगह सिंगल कोट्स का उपयोग करता हूं। यह पाठक को इंगित करने का एक अच्छा तरीका है "मैं यहां कोई इंटरपोलेशन होने का इरादा नहीं रखता हूं", और कम वर्णों से बचने की ज़रूरत है (आमतौर पर केवल \ और ')। – Ether

14

वहाँ निश्चित रूप से छिपा gotchas हैं - पर्ल बिना किसी समस्या के तरह

"$array[$subscript]" 

और

"$hashref->{key}" 

सरल चर नाम, और भाव के साथ सौदा होगा। चूंकि आपकी अभिव्यक्ति अधिक जटिल होती है, हालांकि, आखिरकार पर्ल यह बताने में सक्षम नहीं होगा कि आपकी अभिव्यक्ति कहां रुकती है और आपकी स्ट्रिंग का शेष प्रारंभ होता है।

वहाँ (अब मूल रूप से here, लेकिन नीचे) इस पत्र Variable Interpolation in Double-Quoted Strings में रक्तमय विवरण के बहुत सारे हैं

12

' पकड़ लिया है:

$owner = "John"; 
$item = "motorcycle". 
print "This is $owner's $item.\n"; # Oops, parsed as $owner::s 

लेकिन इसके बाद के संस्करण सुरक्षित रूप से

print "This is ${owner}'s $item.\n"; 
के रूप में लिखा जा सकता है
+0

... या 'प्रिंट करें "यह" $ स्वामी, "$ s आइटम है। \ N"; –

3

चूंकि हम इंटरपोलेशन गॉथस के बारे में बात कर रहे हैं, इसका उल्लेख यह है कि यदि आप एकल उद्धृत स्ट्र का उपयोग कर रहे हैं बैठकों प्रक्षेप से बचने के लिए, आप अभी भी स्लैश से बचने के लिए की आवश्यकता होगी:

'c:\files\' #parse error 
'c:\files\\' #correct 

इस वजह से पहली स्ट्रिंग के अंतिम चरित्र, एक भाग निकले एकल उद्धरण की तरह दिखता है बल्कि स्ट्रिंग टर्मिनेटर से। एक बच निकला स्लैश भी एक उद्धृत तारों में एक स्लैश में परिवर्तित किया जाएगा

+0

यदि आपके पास एक चर में वह डेटा है, तो आपको इसे सही ढंग से इंटरपोलेट करने के लिए अतिरिक्त स्लेश की आवश्यकता नहीं है। हालांकि यह वास्तव में एक इंटरपोलेशन समस्या नहीं है, क्योंकि आपके उदाहरण दिखाते हैं कि यह एकल-उद्धृत (गैर-इंटरपोलेटेड) तारों के साथ भी होता है। –

12

इंटरपोलेशन के साथ देखने के लिए कई चीजें हैं, हालांकि एक बार जब आप उनके बारे में जानते हैं, तो आप उन्हें कभी भी गलती से नहीं करते हैं।

मान्य पहचानकर्ता पाठ के बगल में एक चर नाम डालना। पर्ल को सबसे लंबा वैध वैरिएबल नाम मिलता है और इससे पहले पर परिभाषित नहीं किया जाता है। आप स्पष्ट रूप से कोष्ठक चर नाम हिस्से को सेट कर सकते हैं:

my $p = 'p'; 
    print "Mind your $ps and qs\n"; # $ps, not $p 

    print "Mind your ${p}s and qs"; # now its $p 

अब, यह उदाहरण में, मैं apostrophe भूल गया। यदि मैं इसे जोड़ता हूं, तो मुझे एक और समस्या है क्योंकि एस्ट्रोफ़े पुराने दिनों से पैकेज विभाजक होता था और यह अभी भी काम करता है।ब्रेसिज़ भी वहाँ काम करते हैं:

my $p = 'p'; 
    print "Mind your $p's and q's\n"; # $p::s, not $p 

    print "Mind your ${p}'s and q's"; # now its $p 

पर्ल भी एक तत्व हैश और सरणियों को एक्सेस करता है, तो एक चर नाम के आगे अनुक्रमण पात्रों डाल कुछ करना हो सकता है आप नहीं चाहते को जोड़ सकते हैं:

print "The values are $string[$foo]\n"; That's the element at index $foo 
print "The values are $string{$foo}\n"; That's the value for the key $foo 

जब आप एक स्ट्रिंग में एक ईमेल पता चाहते हैं, तो आप पर्ल इंटरपोलेट्स सरणी भूल सकते हैं। पर्ल कि जब तक आप एक गंभीर त्रुटि फरार हो बनाने के लिए इस्तेमाल @:

print "Send me mail at [email protected]\n"; # interpolates @example 

print "Send me mail at joe\@example.com\n"; 

के बाद से पर्ल बैकस्लैश का उपयोग करता है कुछ अक्षर से बचने के लिए, आप उन तक दोगुना करने के लिए जब आप एक शाब्दिक एक चाहते की जरूरत है:

print "C:\real\tools\for\new\work";  # not what you might expect 

print "C:\\real\\tools\\for\\new\\work"; # kinda ugly, but that's life 
print "C:/real/tools/for/new/work";  # Windows still understands this 

इन मामूली गेटचास के बावजूद, मुझे वास्तव में आसानी से याद आती है जिसके साथ मैं पर्ल में तारों का निर्माण कर सकता हूं यदि मुझे दूसरी भाषा का उपयोग करना है।

+2

अगर आप गलती से 'प्रिंट" [email protected] "चेतावनी के साथ लिखते हैं तो" एक्सप्लंप के संभावित अनपेक्षित इंटरपोलेशन "की एक विशिष्ट चेतावनी भी है। जब तक कि आप दुर्भाग्यपूर्ण नहीं थे, वैसे भी, सरणी में 'example' सरणी है, वैसे भी। – hobbs

0

इंटरपोलेशन एक महान सरलीकृत और समय बचतकर्ता है। लेकिन बहुत दूर जाना संभव है।

यदि आप चाहें तो इंटरपोलेशन के साथ आप कुछ विचित्र सामान कर सकते हैं।

@foo = 0..10; 
print "$foo[2*3]"; # prints 6 

और रोमांचक मनमाना प्रक्षेप के लिए आप इस abomination उपयोग कर सकते हैं:

print "@{[ some_function_call('in list context') ]}"; 

आप सच में, सच, अंतर्वेशित समारोह काम कहता है बनाना चाहते हैं उसके लिए एक मॉड्यूल है। Interpolation देखें। यह आपको इस तरह की चीजें करने देता है:

use Interpolation; 
print "I like $eval{ what_I_like() }; 

sub what_like_like { 
    return 'pie'; 
} 

और बहुत कुछ।

इस मॉड्यूल पर पृष्ठभूमि के लिए, Identity.pm: A Very Funny Module और Interpolation देखें।

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