2010-04-28 9 views
32

$this, @that, और %those के बीच पर्ल में क्या अंतर है?

+3

मैं इस बारे में शिकायत करने वाला था कि यह कई बार एक डुप्ली हो रहा है, लेकिन जब मुझे लगता है कि पर्ल सिगिल का उपयोग क्यों करता है, यह बताता है कि सिगिल का मतलब क्या है, वहां कोई नहीं है सवाल विशेष रूप से पूछते हैं "इनका क्या मतलब है?"तो +1 –

+0

आपको यह संबंधित प्रश्न भी उपयोगी हो सकता है: http://stackoverflow.com/questions/1235837/whats-a-simple-ref – dreeves

+7

आपको दस्तावेज़ीकरण उपयोगी मिल सकता है। क्या हमें वास्तव में सबसे बुनियादी दोहराना है उपयोगकर्ता मैनुअल की सामग्री यहां? – Svante

उत्तर

21

$this यह धारण कई तरह ("apple", "orange", "pear")

%those मूल्यों की एक हैश है, यह ("apple" => "red", "orange" => "orange", "pear" => "yellow") जैसे प्रमुख मूल्य जोड़े रखती है, एक अदिश मूल्य, यह रखती है 1 apple की तरह आइटम

@that मूल्यों की एक सरणी है

पर्ल चर प्रकारों पर अधिक के लिए perlintro देखें।

+4

perldoc वास्तव में काफी अच्छा है: http://perldoc.perl.org/perldata.html (या यदि आपके पास प्रलेखन स्थापित है, तो 'perldoc perldata' चलाएं) – Cascabel

+10

साइड नोट: $ स्केलर मान अक्सर (संदर्भ) सरणी और हैंश (और कभी-कभी अन्य स्केलर) पर इंगित करने के लिए उपयोग किए जाते हैं। –

+2

@ फ्रैंक - हाँ, वह और सरणी हैश के रूप में इस्तेमाल किया जाना चाहिए। मेरा पसंदीदा उप में है नामित पैरामीटर के साथ: 'मेरा ($ foo, $ bar) = @ {@_} {qw/foo bar /};' – amphetamachine

3

शायद आप perlintro और perlsyn दस्तावेज़ों को देखना चाहते हैं ताकि वास्तव में पर्ल को समझने के लिए शुरू किया जा सके (यानी, फ़्लिपिंग मैनुअल पढ़ें)। :-)

कहा कि:

  • $this एक अदिश है, जो एक संख्या (पूर्णांक या नाव), एक स्ट्रिंग, या एक संदर्भ (नीचे देखें) स्टोर कर सकते हैं है,
  • @that एक सरणी है, जो स्केलर्स की एक आदेशित सूची संग्रहीत कर सकती है (ऊपर देखें)। आप push या unshift कार्य (perlfunc देखें) के साथ एक सरणी के लिए एक अदिश जोड़ सकते हैं, और आप शाब्दिक शृंखला बनाने के लिए अदिश शाब्दिक या चर का एक कोष्ठक-घिरा अल्पविराम द्वारा पृथक सूची का उपयोग कर सकते (यानी, my @array = ($a, $b, 6, "seven");)
  • %those एक हैश है, जो एक सहयोगी सरणी है। हैश के पास प्रविष्टियों के प्रमुख मूल्य जोड़े हैं, जैसे कि आप इसकी कुंजी की आपूर्ति करके हैश के मूल्य तक पहुंच सकते हैं। हैश लिटरल को सूचियों की तरह भी निर्दिष्ट किया जा सकता है, सिवाय इसके कि प्रत्येक विषम प्रविष्टि एक कुंजी है और प्रत्येक भी एक मूल्य है। आप एक कुंजी और मूल्य को अलग करने के लिए अल्पविराम के बजाय => वर्ण का भी उपयोग कर सकते हैं। (अर्थात, my %ordinals = ("one" => "first", "two" => "second");)

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

+0

साइड नोट: पर्ल (प्री पर्ल 6) में, जब आप किसी तत्व को पुनर्प्राप्त करने के लिए किसी सरणी या हैश तक पहुंचते हैं, तो उस बिंदु पर '$ 'सिगिल है उस पहुंच के लिए इस्तेमाल किया; ऐसा इसलिए है क्योंकि जब आप किसी सरणी या हैश में खुदाई कर रहे हैं, तो आप वास्तव में क्या प्राप्त कर रहे हैं एक स्केलर है, और लैरी वॉल (पर्ल के निर्माता) का मानना ​​है कि स्केलर सिगिल का उपयोग करने के लिए यह अधिक समझ में आया है कि यह मानने के लिए कि आप ' फिर से इस्तेमाल किया जा सकता है एक सामान्य स्केलर चर का उपयोग किया जा सकता है। पर्ल v5.20 में –

+0

, आप एक [कुंजी-मूल्य स्लाइस] प्राप्त करने के लिए एक सरणी या हैश में '%' लागू कर सकते हैं (http://www.effectiveperlprogramming.com/2014/07/perl-5-20 -इंटरजेस-कीवल्यू-स्लाइस /) –

31

पर्ल sigils के लिए एक उपयोगी स्मरक हैं:

  • calar
  • @rray
  • % राख $

Matt Troutblog.fogus.me पर एक बड़ा टिप्पणी लिखी पर्ल sigils जो मुझे लगता है के बारे में है उपयोगी है इसलिए नीचे चिपकाया गया है:

दरअसल, perl sigils वैरिएबल प्रकार को इंगित नहीं करते हैं - वे संयोग को दर्शाते हैं - $ 'the' है, @ 'इन',% 'का नक्शा' है या इसलिए - परिवर्तनीय प्रकार [] या {} के माध्यम से दर्शाया गया है।

my $foo = 'foo'; 
my @foo = ('zero', 'one', 'two'); 
my $second_foo = $foo[1]; 
my @first_and_third_foos = @foo[0,2]; 
my %foo = (key1 => 'value1', key2 => 'value2', key3 => 'value3'); 
my $key2_foo = $foo{key2}; 
my ($key1_foo, $key3_foo) = @foo{'key1','key3'}; 

तो sigil को देख जब पर्ल कोड स्कीम आपको बताता है कि आप क्या बल्कि आप क्या पर काम कर रहे हैं की तुलना में -get- लिए जा रहे हैं, काफी: आप के साथ देख सकते हैं।

यह स्वीकार्य रूप से, जब तक आप इसका उपयोग नहीं करते हैं, वास्तव में भ्रमित हो रहा है, लेकिन एक बार जब आप इसे इस्तेमाल करते हैं तो स्किमिंग कोड के दौरान जानकारी को अवशोषित करने के लिए यह एक बेहद उपयोगी टूल हो सकता है।

आप अभी भी पूरी तरह से निश्चित रूप से, यह नफरत के हकदार रहे हैं, लेकिन यह एक दिलचस्प अवधारणा है और मैं समझ :)

चल रहा था आप बल्कि आप क्या सोचा से नफरत करने के लिए क्या -actually- हो रहा है पसंद कर सकते हैं
+0

इतनी दृढ़ता से सिग्नल को परिवर्तनीय प्रकारों से जोड़ना गलत है। यही कारण है कि बहुत से लोगों को उनके साथ समस्या है। "मैट" से पहले सबकुछ हटाने के लिए यह आपके लिए बेहतर होगा। –

+1

@brian d foy: मुझे उद्धृत पोस्ट के साथ कुछ भी गलत नहीं दिख रहा है - यह मेरे लिए सही मायने रखता है, लेकिन फिर मैंने पर्ल को वास्तव में आसानी से उठाया। तो अगर आपके बारे में मुझसे कोई फर्क नहीं पड़ता है, तो इसके बारे में क्या यह आपके लिए एक बुरा उद्धरण बनाता है? –

+0

मुझे लगता है कि आपने मेरी टिप्पणी में "पहले" शब्द को याद किया था। मैट की सामग्री "बाद" है। :) –

7

पर्ल का आविष्कारक एक भाषाविद था, और उसने पर्ल को "प्राकृतिक भाषा" की तरह बनाने की कोशिश की।

this post से:

अस्पष्टता दूर संख्या, केस और शब्द क्रम कारण एक भाषा कुछ स्थानीय अस्पष्टता के साथ भाग प्राप्त कर सकते हैं की

भाग द्वारा कि अन्य अस्पष्टता विभिन्न तंत्र द्वारा दबा दिया जाता है। अंग्रेजी सर्वनाम में एक केस सिस्टम के निवासी के साथ संख्या और शब्द आदेश का उपयोग करती है: "आदमी ने पुरुषों को देखा, और उन्होंने उसे वापस देखा।" यह उस वाक्य में पूरी तरह से स्पष्ट है जो किसके साथ कर रहा है। इसी प्रकार, पर्ल के नाम पर संख्या मार्कर हैं; यानी, $ कुत्ता एक पोच है, और @ डॉग (संभावित रूप से) कई हैं। तो $ और @ अंग्रेजी में में "यह" और "इन" की तरह थोड़ा हैं। [जोर जोड़ा गया]

+1

और $ _ "यह" है। – AmbroseChapel

7

लोग अक्सर अलग-अलग प्रकार के सिग्लों को बांधने का प्रयास करते हैं, लेकिन वे केवल थोड़े से संबंधित हैं। यह एक विषय है जिसे हमने Learning Perl और Effective Perl Programming में बहुत कठिन मारा क्योंकि जब आप सिगल्स को समझते हैं तो पर्ल को समझना बहुत आसान होता है।

कई लोग भूल जाते हैं कि चर और डेटा वास्तव में अलग-अलग चीजें हैं। वेरिएबल डेटा स्टोर कर सकते हैं, लेकिन डेटा का उपयोग करने के लिए आपको चर की आवश्यकता नहीं है।

$scalar_var 
$array[1] 
$hash{key} 

@ से अधिक मान को दर्शाता है:

$ एक भी अदिश मूल्य (जरूरी नहीं एक अदिश चर) को दर्शाता है।

@array; 
@array[1,2] 
@hash{qw(key1 key2)} 
@{ func_returning_array_ref }; 

% को दर्शाता जोड़े (कुंजी और मूल्यों) है, जो एक हैश चर या एक भिन्नता हो सकती है::

%hash 
%$hash_ref 

कि एक पूरे के रूप सरणी, एक टुकड़ा है, या एक भिन्नता हो सकती है पर्ल v5.20 के तहत, % अब key/value slice या या तो हैश या सरणी को इंगित कर सकता है:

% सरणी [@indices]; # इंडेक्स और तत्वों के जोड़े रिटर्न % हैश {@keys}; # उन चाबियों के लिए कुंजी-मानों के जोड़े लौटाते हैं

+0

साइड नोट: आप स्केलर संदर्भ भी प्राप्त कर सकते हैं - बिंदु क्या होगा, मुझे नहीं पता, लेकिन आप कर सकते हैं। उनको अस्वीकार करना '$$ scalar_ref' जैसे कुछ के साथ किया जाता है। –

+2

स्केलर संदर्भ उन्हें कॉपी किए बिना बड़े डेटा को पास करने के लिए अच्छा है। –

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