2009-09-08 14 views
7
#!/usr/bin/perl 

use strict; 
use warnings; 

my @a = qw/a b c/; 
(@a) x= 3; 
print join(", ", @a), "\n"; 

मैं ऊपर कोड "a, b, c, a, b, c, a, b, c\n" मुद्रित करने के लिए उम्मीद करेंगे, लेकिन इसके बजाय यह संदेश के साथ मर जाता है:जब मैं सरणी असाइनमेंट ऑपरेटर को सरणी के साथ उपयोग करने का प्रयास करता हूं तो मुझे कोई त्रुटि क्यों मिलती है?

Can't modify private array in repeat (x) at z.pl line 7, near "3;" 

यह अजीब लगता है क्योंकि X <op>= YX = X <op> Y के बराबर होने के रूप में लिखित हैं, और निम्न कोड के रूप में काम मैं इसे करने की उम्मीद:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @a = qw/a b c/; 
(@a) = (@a) x 3; 
print join(", ", @a), "\n"; 

इस पर्ल में एक बग है या मैं गलत समझ रहा हूँ कि यहाँ क्या उसका क्या होगा?

उत्तर

0

समस्या यह है कि आप जगह पर @ ए को संशोधित करने की कोशिश कर रहे हैं, जो कि पर्ल स्पष्ट रूप से आपको करने की अनुमति नहीं देता है। आपका दूसरा उदाहरण कुछ अलग-अलग काम कर रहा है, जो एक नई सरणी बनाना है जिसमें @a दो बार दोहराया गया है, फिर उस मान के साथ @ ए ओवरराइट करना।

तर्कसंगत रूप से पहला रूप पारदर्शी रूप से दूसरे रूप में अनुवाद किया जाना चाहिए, लेकिन वास्तव में ऐसा नहीं होता है। आप इसे एक बग पर विचार कर सकते हैं ... इसे उचित स्थानों पर दर्ज करें और देखें कि क्या होता है।

1

मेरा अनुमान है कि पर्ल पूर्ण प्रतीकात्मक परिवर्तन वाली भाषा नहीं है। यह पता लगाने की कोशिश करता है कि आपका क्या मतलब है। यदि आप "सूची-ify" @a, इसे माता-पिता में डालकर, यह खो देता है जिसे आप इसे असाइन करना चाहते हैं।

सूचना है कि इस हम क्या चाहते हैं नहीं करता है:

my @b = @a x 3; # we'll get scalar(@a) --> '3' x 3 --> '333' 

लेकिन, यह करता है: करता

my @b = (@a) x 3; 

के रूप में:

(@a) = (@a) x 3; 

तो ऐसा लगता है कि जब अभिव्यक्ति वास्तव में दोनों पक्षों पर प्रतीत होता है पर्ल उन्हें विभिन्न संदर्भों में व्याख्या करता है। यह जानता है कि हम कुछ असाइन कर रहे हैं, इसलिए यह पता लगाने की कोशिश करता है कि हम क्या कर रहे हैं।

मैं इसे एक बहुत ही कम इस्तेमाल किए गए वाक्यविन्यास से, एक बग तक चॉक कर दूंगा।

+0

हाँ, मैं केवल इसमें भाग गया क्योंकि मैं सभी ऑपरेटरों (github.com/cowens/perlopref) को दस्तावेज कर रहा हूं और मैं अपनी भरोसेमंद धारणा का परीक्षण कर रहा था कि उसे क्या करना चाहिए। –

+1

मुझे नहीं लगता कि मैं इसे एक बग कहूंगा, क्योंकि पर्ल 4 मैनुअल स्पष्ट रूप से उल्लेख करता है कि यह केवल स्केलर्स पर काम करता है: http://www.cs.cmu.edu/afs/cs.cmu।edu/web/people/rgs/pl-exp-op.html # x – mercator

+0

@mercator यह पर्ल मैनुअल नहीं है (जो या तो ऊंट या 'perldoc' से कुछ सुलभ होगा) होगा। तथ्य यह है कि यह एक ही व्यवहार को दस्तावेज करता है इसका मतलब यह नहीं है कि व्यवहार एक बग नहीं है। वर्तमान (5.10.1) दस्तावेज के लिए http://perldoc.perl.org/perlop.html#Assignment-Operators देखें। –

4

मेरा पहला विचार यह था कि यह पर्ल के हिस्से पर कुछ सूक्ष्मता की गलतफहमी थी, अर्थात् @a के माता-पिता ने इसे सूची में निर्दिष्ट करने के प्रयास के रूप में पार्स बना दिया। (। सूची ही है, नहीं सामान्य सूची असाइनमेंट) यह निष्कर्ष perldiag द्वारा समर्थित किया जा रहा है:

Can't modify %s in %s

(F) You aren't allowed to assign to the item indicated, or otherwise try to change it, such as with an auto-increment.

जाहिर है कि ऐसा नहीं है, हालांकि है। यदि यह थे यह एक ही त्रुटि होना चाहिए:

@a x= 3; # Can't modify private array in repeat... 

Ergo, निश्चित रूप से एक बग:

($x) x= 3; # ok 

अधिक निर्णायक, यह वही त्रुटि देता है। इसे फाइल करें

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

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