दो विचार हैं। स्पष्ट एक यह है कि आपकी सरणी कितनी बड़ी होगी? यदि यह कुछ दर्जन तत्वों से कम है, तो आकार एक कारक नहीं है (जब तक कि आप कुछ तेजी से बुलाए गए फ़ंक्शन के लिए माइक्रो-ऑप्टिमाइज़िंग नहीं कर लेते हैं, लेकिन आपको इसे साबित करने के लिए कुछ मेमोरी प्रोफाइलिंग करना होगा)।
यह आसान हिस्सा है। अनदेखा दूसरा विचार इंटरफ़ेस है। लौटाए गए सरणी का उपयोग कैसे किया जा रहा है? यह महत्वपूर्ण है क्योंकि पर्ल में पूरी सरणी डीरफ्रेंसिंग थोड़ी भयानक है। उदाहरण के लिए:
for my $info (@{ getInfo($some, $args) }) {
...
}
यह बदसूरत है। यह काफी बेहतर है।
for my $info (getInfo($some, $args)) {
...
}
यह खुद को मानचित्रण और पकड़ने के लिए भी उधार देता है।
my @info = grep { ... } getInfo($some, $args);
लेकिन एक सरणी रेफरी लौटने सुविधाजनक हो सकता है यदि आप अलग-अलग तत्वों बाहर लेने के लिए जा रहे हैं:
my $address = (getInfo($some, $args))[2];
या::
my @info = getInfo($some, $args);
my $address = $info[2];
कि तुलना में आसान है
my $address = getInfo($some, $args)->[2];
लेकिन उस बिंदु पर, आप sho उल सवाल है कि @info वास्तव में एक सूची है या हैश है।
my $address = getInfo($some, $args)->{address};
आपको नहीं करना चाहिए क्या getInfo()
है अदिश संदर्भ में एक सरणी रेफरी और सूची संदर्भ में एक सरणी वापसी है। यह स्केलर संदर्भ के पारंपरिक उपयोग को सरणी लंबाई के रूप में जोड़ता है जो उपयोगकर्ता को आश्चर्यचकित करेगा।
अंत में, मैं अपना खुद का मॉड्यूल, Method::Signatures प्लग करूंगा, क्योंकि यह सरणी संदर्भ वाक्य में उपयोग किए बिना सरणी संदर्भों में गुजरने के लिए एक समझौता प्रदान करता है।
use Method::Signatures;
method foo(\@args) {
print "@args"; # @args is not a copy
push @args, 42; # this alters the caller array
}
my @nums = (1,2,3);
Class->foo(\@nums); # prints 1 2 3
print "@nums"; # prints 1 2 3 42
यह Data::Alias के जादू के माध्यम से किया जाता है।
हो सकता है कि आप एक उच्च स्तर पर समझा सकें जो आप करने की कोशिश कर रहे हैं। जो भी आप चाहते हैं उसे लिखने का एक और आधुनिक, पर्लिश तरीका हो सकता है जो आपकी समस्या से पूरी तरह से बच जाएगा। या कम से कम अपने इरादे को और स्पष्ट करें। –
@ अज्ञात (गूगल): मैं इसे अक्सर अलग-अलग संदर्भों में करता हूं। पिछली बार जब मैं एक सरणी में एक फाइल पढ़ना चाहता था। तो फ़ाइल को खोला जाना है, मैं एसटीडीईआरआर पर कौन सी फाइल खोल रहा हूं, इस बारे में जानकारी प्रिंट करता हूं, लाइनों को थोड़ा सा संशोधित करता हूं और उन्हें सरणी पर दबाता हूं, फिर फ़ाइल बंद कर देता हूं। – Frank
कैसे संशोधित करें? जैसे मैप स्टेटमेंट के साथ प्रति लाइन किया जा सकता है? मुझे फिर से अन्य तकनीकों के पक्ष में, अत्यधिक संदिग्ध होने के लिए किसी सरणी पर कुछ धक्का लग रहा है। कभी-कभी इसकी मदद नहीं की जा सकती है, हालांकि –