2009-03-02 11 views
5

मैं कोड की निम्नलिखित पंक्ति में आया हूं। यह समस्या नहीं है:

  • यह धक्का के रूप में भी ऐसा ही करने का इरादा है
  • यह मैं के बाद से धक्का
  • उपयोग करने के लिए यह बदल दिया है धक्का
  • इसे पढ़ने के लिए मुश्किल है का इस्तेमाल किया है करने के लिए,
  • को समझने चाहिए
  • यह कुछ है मैंने सोचा था कि अवैध था, लेकिन स्पष्ट रूप से

यहाँ यह है नहीं है:

$array [++$#array] = 'data'; 

मेरा प्रश्न है: $ # सरणी को पूर्व-वृद्धि करने का क्या अर्थ है? मैंने हमेशा एक सरणी की विशेषता होने के लिए $ # सरणी माना, और लिखने योग्य नहीं।

+0

संपादित के लिए धन्यवाद - कि शीर्षक मैं लिखा जाना चाहिए था है। –

उत्तर

14

perldata का कहना है:

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

कुछ मामलों में $ # सरणी संशोधित करना उपयोगी है, लेकिन इस मामले में, स्पष्ट रूप से धक्का बेहतर है।

+0

उन मामलों में से एक जहां यह बेहतर होगा, जब आप पहले से जानते होंगे कि आपकी सरणी अंत में कितनी बड़ी होगी। विशाल सरणी के साथ यह आपको एक बड़ा प्रदर्शन बढ़ावा देगा। – innaM

+0

पुरानी पर्ल पर $ # सरणी का उपयोग करके विस्तार, पिछले मान वापस मिल जाएगा। –

+0

वह perl4 था, मुझे विश्वास है। – ysth

4

वर्तमान सरणी लंबाई से बड़े मान को $#array सरणी को विस्तारित करता है।

+0

मेरा मानना ​​है कि यह लिंक किसी पुस्तक की अनधिकृत प्रति है। मैं सुझाव दूंगा कि आप इसे हटा दें। – mirod

+0

असल में, लिंक पहले से ही मर चुका है, लेकिन मैं सहमत हूं कि समुद्री डाकू किताबों से जुड़ना एक बुरा विचार है। – Telemachus

+0

जब मैंने इसे चेक किया तो यह मर नहीं गया था, और वहां भी अन्य पुस्तकों का एक समूह था। – mirod

3

इस कोड को भी काम करता है:

$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a' 
Hello world! 

पर्ल सरणी गतिशील है और जब सीमा से परे आवंटित होती है।

+0

मुझे नहीं लगता कि ++ $ # सरणी इसे कैसे नहीं बदलेगी। मुझे लगता है कि असाइनमेंट के बाद, $ # सरणी फिर से उसी मान पर संशोधित की जाती है। –

+0

मुझे लगता है कि '++ $ # सरणी यहां बेकार है। –

+0

यदि आप $ # सरणी का उपयोग करते हैं तो आपको ++ $ # सरणी की आवश्यकता होती है, तो आप सरणी के अंतिम तत्व को ओवरराइट कर देंगे (या 'सर-क्रिएटिव सरणी मान का प्रयास, सबस्क्रिप्ट -1' त्रुटि प्राप्त करें यदि सरणी है खाली) – mirod

1

सबसे पहले, यह गलत है।

उसने कहा, मुझे आश्चर्य भी है कि यह काम करता है। मैंने अनुमान लगाया होगा कि ++$#array किसी संख्या को बढ़ाने की कोशिश करते समय "निरंतर संशोधित नहीं कर सकता" त्रुटि प्राप्त हो गई होगी। (ऐसा नहीं है कि मैंने कभी भी गलती से ऐसा किया है।) लेकिन, मुझे लगता है कि यह वही है जहां हम गलत थे: $#array स्थिर नहीं है (एक संख्या); यह एक परिवर्तनीय अभिव्यक्ति है। जैसे आप इसके साथ गड़बड़ कर सकते हैं।

my @array = qw/1 2 3/; 

++$#array; 
$array[$#array] = qw/4/; 

print "@array\n" 

और यहां तक ​​कि, अतिरिक्त मनोरंजन के लिए, इस:

my @array = qw/1 2 3/; 

$#array += 5; 

foreach my $wtf (@array) { 
    if (defined $wtf) { 
    print "$wtf\n"; 
    } 
    else { 
    print "undef\n"; 
    } 
} 

और, हाँ, पर्ल कुकबुक खुश गड़बड़ करने के लिए $#array के साथ बढ़ती या सरणियों काटना है (अध्याय 4 निम्नलिखित पर विचार करें , नुस्खा 3)। मुझे अभी भी बदसूरत लगता है, लेकिन शायद यह सिर्फ एक झुकाव है "लेकिन यह एक संख्या" पूर्वाग्रह है।

+0

मुझे आपके बारे में निश्चित नहीं है लेकिन * मुझे लगता है कि यह बदसूरत है क्योंकि इसमें 4 विराम चिह्न हैं, जो एक पंक्ति में विभाजक या माता-पिता नहीं हैं .... मेरा मतलब है, मैं भी एक = बी + (foo? - $ # सरणी: + $ # सरणी); बदसूरत बी-) –

+0

मैं भी आश्चर्यचकित था कि यह काम किया। –

4

एक पोस्ट-वृद्धि पहले चर को वापस कर देगी और फिर इसे बढ़ाएगी।

यदि आप पोस्ट-वृद्धि का उपयोग करते हैं तो आप अंतिम तत्व को संशोधित करेंगे, क्योंकि यह पहले लौटाया गया था, और फिर अंत में एक खाली तत्व को दबा रहा था।दूसरे लूप पर आप उस खाली मूल्य को संशोधित करेंगे और बाद में एक नया खाली दबाएंगे। तो यह बिल्कुल धक्का की तरह काम नहीं करेगा।

पूर्व वृद्धि वृद्धि चर को बढ़ाएगी और फिर इसे वापस कर देगी। इस तरह आपका उदाहरण हमेशा एक नए, अंतिम तत्व को सरणी और धक्का जैसे काम पर लिख रहा होगा। नीचे दिए गए उदाहरण:

my (@pre, @post); 

$pre[$#pre++] = '1'; 
$pre[$#pre++] = '2'; 
$pre[$#pre++] = '3'; 


$post[++$#post] = '1'; 
$post[++$#post] = '2'; 
$post[++$#post] = '3'; 

print "pre keys: "[email protected]"\n"; 
print "pre: @pre\n"; 
print "post keys: "[email protected]"\n"; 
print "post: @post\n"; 

आउटपुट:

pre keys: 3 
pre: 2 3 
post keys: 3 
post: 1 2 3 
+0

वृद्धि ऑपरेटर (ओं) का "वापसी" मूल्य एक महत्वपूर्ण भेदभाव आईएमओ है, मुझे खुशी है कि किसी ने इसे बनाया है। – jettero

+1

@pre = (2, 3, undef); –

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