perl - पर्ल में एक सरणी का आकार खोजें




(8)

ऐसा लगता है कि एक सरणी के आकार को खोजने के कई अलग-अलग तरीकों से आया है। इन तीन तरीकों के बीच क्या अंतर है?

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size

उदाहरण:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2

दूसरे तरीके का उपयोग करने के लिए, 1 जोड़ें:

print $#arr + 1; # Second way to print array size

यदि हम दूसरे को थोड़ा सा संशोधित करते हैं तो सभी तीन एक ही परिणाम देते हैं:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;

यह सरणी को स्केलर संदर्भ में मजबूर कर आकार प्राप्त करता है, जिसमें इसका मूल्यांकन इसके आकार के रूप में किया जाता है:

print scalar @arr;

सरणी को स्केलर संदर्भ में मजबूर करने का यह एक और तरीका है, क्योंकि इसे स्केलर वैरिएबल को असाइन किया जा रहा है:

my $arrSize = @arr;

यह सरणी में अंतिम तत्व की अनुक्रमणिका प्राप्त करता है, इसलिए यह वास्तव में आकार शून्य 1 है (माना जाता है कि सूचकांक 0 से शुरू होता है, जो पर्ल में समायोज्य है हालांकि ऐसा करना आमतौर पर एक बुरा विचार है):

print $#arr;

यह अंतिम एक सरणी आकार प्राप्त करने के लिए उपयोग करने के लिए वास्तव में अच्छा नहीं है। यह उपयोगी होगा यदि आप केवल सरणी का अंतिम तत्व प्राप्त करना चाहते हैं:

my $lastElement = $arr[$#arr];

साथ ही, जैसा कि आप यहां स्टैक ओवरफ़्लो पर देख सकते हैं, यह वाक्य अधिकांश वाक्यविन्यास हाइलाइटर्स द्वारा सही ढंग से संभाला नहीं जाता है ...


सरणी के आकार को खोजने के लिए scalar कीवर्ड का उपयोग करें:

print scalar @array;

सरणी की अंतिम अनुक्रमणिका को जानने के लिए $# (पर्ल डिफ़ॉल्ट चर) है। यह एक सरणी की अंतिम सूचकांक देता है। चूंकि एक सरणी 0 से शुरू होती है, इसलिए हमें एक $# जोड़कर सरणी का आकार मिलता है:

print "$#array+1";

उदाहरण:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

आउटपुट:

3

3

सरणी के आकार को मुद्रित करने के कई तरीके हैं। यहां सभी का अर्थ है: आइए कहें कि हमारी सरणी my @arr = (3,4);

विधि 1: स्केलर

सरणी के आकार को पाने का यह सही तरीका है।

print scalar @arr;  # prints size, here 2

विधि 2: सूचकांक संख्या

$#arr एक सरणी की अंतिम अनुक्रमणिका देता है। इसलिए यदि सरणी आकार 10 है तो इसकी अंतिम अनुक्रमणिका 9 होगी।

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size

हम एरे को 0-अनुक्रमित मानते हुए यहां 1 जोड़ रहे हैं। लेकिन, यदि यह शून्य पर आधारित नहीं है, तो यह तर्क विफल हो जाएगा

perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

उदाहरण के ऊपर प्रिंट 6, क्योंकि हमने इसकी प्रारंभिक अनुक्रमणिका 4 को सेट कर दी है। अब सूचकांक क्रमशः 3 और 4 के साथ 5 और 6 होगा।

विधि 3:

जब स्केलर संदर्भ में एक सरणी का उपयोग किया जाता है, तो यह सरणी का आकार देता है

my $size = @arr;
print $size;   # prints size, here 2

असल में विधि 3 और विधि 1 समान हैं।


पर्लिंटो दस्तावेज के "पर्ल चर प्रकार" खंड में शामिल हैं

विशेष चर $#array आपको $#array के अंतिम तत्व की अनुक्रमणिका बताती है:

print $mixed[$#mixed];       # last element, prints 1.23

आपको $#array + 1 का उपयोग करने के लिए प्रेरित किया जा सकता है ताकि आपको यह बताने के लिए कि $#array + 1 कितनी चीज़ें हैं। भेजा मत खा। जैसा कि होता है, @array का उपयोग करते हुए जहां पर्ल को स्केलर मान ("स्केलर संदर्भ में") ढूंढने की उम्मीद है, आपको सरणी में तत्वों की संख्या देगा:

if (@animals < 5) { ... }

perldata भी इसे "स्केलर मान" खंड में शामिल करता है

यदि आप स्केलर संदर्भ में एक सरणी का मूल्यांकन करते हैं, तो यह सरणी की लंबाई देता है। (ध्यान दें कि यह सूचियों के बारे में सच नहीं है, जो सी अल्पविराम ऑपरेटर की तरह अंतिम मूल्य लौटाता है, न ही अंतर्निहित कार्यों का, जो लौटने की तरह महसूस करता है।) निम्नलिखित हमेशा सत्य है:

scalar(@whatever) == $#whatever + 1;

कुछ प्रोग्रामर एक स्पष्ट रूपांतरण का उपयोग करना चुनते हैं ताकि संदेह के लिए कुछ भी नहीं छोड़ा जा सके:

$element_count = scalar(@whatever);

इससे पहले एक ही खंड में दस्तावेज एक सरणी के अंतिम तत्व की अनुक्रमणिका कैसे प्राप्त करें।

एक सरणी की लंबाई एक स्केलर मान है। csh में $#days मूल्यांकन करके आपको सरणी @days की लंबाई मिल सकती है। हालांकि, यह सरणी की लंबाई नहीं है; यह अंतिम तत्व की सबस्क्रिप्ट है, जो एक अलग मूल्य है क्योंकि आमतौर पर 0 वां तत्व होता है।


int(@array) बारे में क्या है क्योंकि यह तर्क को स्केलर के रूप में धमकाता है।







perl