इस कोड काम करता है:
#!/bin/perl -w
use strict;
sub PrintAA
{
my($test, %aa) = @_;
print $test . "\n";
foreach (keys %aa)
{
print $_ . " : " . $aa{$_} . "\n";
}
}
my(%hash) = ('aaa' => 1, 'bbb' => 'balls', 'ccc' => \&PrintAA);
PrintAA("test", %hash);
प्रमुख मुद्दा मेरी() फंक्शन में 'बयान' में सरणी संदर्भ का उपयोग है।
क्या सरणी संदर्भ व्यवसाय वास्तव में क्या करता है?
संक्षेप में, यह सही तरीके से काम करता है।
इसका मतलब है कि @_
तर्कों में से पहला मान $test
पर दिया गया है, और शेष आइटम हैश %aa
को असाइन किया गया है। जिस तरह से मैंने इसे बुलाया, @_
में वस्तुओं की एक विषम संख्या है, इसलिए एक बार जब पहली आइटम $test
पर असाइन की जाती है, तो %aa
को असाइन करने के लिए कई आइटम उपलब्ध हैं, प्रत्येक जोड़ी के पहले आइटम के साथ कुंजी ('aaa', 'bbb', 'ccc' मेरे उदाहरण में), और दूसरा संबंधित मान है।
@aa
के साथ प्रतिस्थापित करना संभव होगा, इस स्थिति में, सरणी में 6 आइटम होंगे। को $aa
के साथ प्रतिस्थापित करना भी संभव होगा, और उस स्थिति में, चर $aa
में 'aaa' मान होगा, और @_
में शेष मान असाइनमेंट द्वारा अनदेखा किए जाएंगे।
यदि आप परिवर्तनीय सूची के चारों ओर कोष्ठक छोड़ देते हैं, तो पर्ल कोड को संकलित करने से इंकार कर देता है। विकल्प जवाब में से एक अंकन से पता चला है:
my $test = shift;
my(%aa) = @_;
यह मैं क्या लिखा है के लिए काफी होता है; अंतर यह है कि दो my
कथन के बाद, @_
में केवल इस भिन्नता में 6 तत्व हैं, जबकि एकल my
संस्करण में, इसमें अभी भी 7 तत्व हैं।
सरणी संदर्भ के बारे में SO में निश्चित रूप से अन्य प्रश्न हैं।
वास्तव में, मैं my($test, %aa) = @_;
मैं पूछ रहा था के बारे में my(%hash) = ('aaa' => 1, 'bbb' => 'balls', 'ccc' => \&PrintAA);
my %hash = { 'aaa' => 1, ... };
बनाम
अंतर यह है कि {...} अंकन एक हैश रेफरी और (उत्पन्न करता है के बारे में पूछ नहीं किया गया था ...) नोटेशन एक सूची उत्पन्न करता है, जो एक हैश के लिए नक्शा बनाता है (हैश रेफ के विपरीत)। इसी तरह, [...] एक सरणी रेफरी उत्पन्न करता है और एक सरणी नहीं।
वास्तव में, 'मुख्य' कोड बदलें ताकि यह पढ़ सके: मेरा (% हैश) = {...}; और आप एक रन-टाइम मिलता है (लेकिन समय संकलन) त्रुटि - सावधानी के साथ इलाज लाइन नंबर के बाद से मैं अपनी फ़ाइल के लिए वैकल्पिक codings जोड़ दिया है:
Reference found where even-sized list expected at xx.pl line 18.
...
Use of uninitialized value in concatenation (.) or string at xx.pl line 13.
क्या आप हमें कोड दिखा सकते हैं? –
क्या आप हमें कॉलिंग कोड दिखा सकते हैं? –