perl

2013-05-16 6 views
6

में मेरे चर के साथ भ्रम use strict और use warning और का उपयोग करते हुए यदि मैं my डेटाटाइप निर्दिष्ट करता हूं, तो यह काम करता है; अगर मैं my निर्दिष्ट नहीं करता हूं तो यह त्रुटि कहता है।perl

use strict; 
use warnings; 
my $test=10; 
my @arr=(10,20,30); 

अगर मैं एक संख्या के रूप में सरणी चर नाम की घोषणा:

use strict; 
use warnings; 
my @100=(10,20,30); 

तो यह कहते हैं जब मुझे लगता है कि कार्यक्रम चलाने त्रुटि:

Can't use global @100 in "my" at number_sclar.pl line 28, near "my @100" 

अगर मैं हटा दें कि my और चलाने कि कार्यक्रम, यह एक त्रुटि के बिना चलाता है।

तो कृपया कोई मुझे बता सकता है कि क्यों my चर एक संख्यात्मक सरणी चर नाम के साथ समर्थित नहीं है?

+0

मैं अपने चर के कार्य सिद्धांत को जानना चाहता हूं .. इसलिए मैंने यहां पोस्ट किया है। – vara

+0

ठीक है, मेरे पास कोई अच्छी व्याख्या नहीं है; मुझे लगता है कि यह अनुमान लगाएगा कि यह पिछली संगतता के लिए प्रदान किया गया है, विशेष चर के साथ व्यंजन 'जैसे' $^डब्ल्यू '। एफवाईआई: आप 'हमारे @ 100 = (10, 20, 30);' और '100 $ [0] प्रिंट कर सकते हैं; 'त्रुटि को ट्रिगर किए बिना। चेतावनियों का संयोजन और 'मेरा' का अर्थ है कि संख्यात्मक नाम स्वीकार्य नहीं हैं। –

+1

हम्म। कभी सोचा नहीं कि काम करेगा। – OneSolitaryNoob

उत्तर

3

$ 1, $ 2, $ 3, $ 100, आदि बनाने (regex कैप्चर के परिणाम धारण करने के लिए) के एक गैर-इरादतन पक्ष प्रभाव के रूप में; @ 1, @ 2, @ 3, @ 100, आदि भी बनाया गया है।

हालांकि, इन नामों का नाम और perlvar में विशेष वर्रों का पैकेज पैकेज वर्र्स को छोड़कर कानूनी नाम नहीं हैं। उदाहरण के लिए, आप my $(; या sub (; नहीं कर सकते हैं, भले ही $( पैकेज चर [1] के लिए मान्य नाम है।

जब 5.6 में पर्लिकल में लेक्सिकल जोड़े गए थे, तो निश्चित रूप से यह उपयोगकर्ता चर के लिए ऐसे नामों को अनुमति देने के लिए भ्रमित होने के लिए समझा जाता था। वास्तव में, मुझे संदेह है कि किसी ने भी इस विचार का मनोरंजन किया।

Sigil एक तरफ, शाब्दिक वार्स में एक चरित्र से प्रारंभ होना चाहिए [a-zA-Z_] [2] और में [a-zA-Z0-9_] पात्रों में से एक नंबर के बाद किया जा सकता है [2]। ऐसे में, @100 एक व्याख्यात्मक चर के लिए मान्य नाम नहीं है।


नोट्स:

  1. >perl -e"our $(;" 
    
    >perl -e"my $(;" 
    Can't use global $(in "my" at -e line 1, near "my $(" 
    Execution of -e aborted due to compilation errors. 
    
    >perl -e"sub (;" 
    Prototype not terminated at -e line 1. 
    
  2. अधिक कोड अंक वास्तव में अनुमति दी जाती है, लेकिन वे ASCII के चरित्र सेट शामिल नहीं हैं। सादगी के लिए, मैंने केवल कोड बिंदु सूचीबद्ध किए जो ASCII के चरित्र सेट के अंदर आते हैं।

+0

मैंने सोचा था कि केवल $ 1 - $ 9 – jozefg

+0

@jozefg था, ऐसा नहीं है, क्योंकि आप एक परीक्षण के साथ सत्यापित कर सकते थे। – ikegami

9
perldoc perlvar से

:

Perl identifiers that begin with digits, control characters, or punctuation characters are exempt from the effects of the "package" declaration and are always forced to be in package "main"; they are also exempt from "strict 'vars'" errors. A few other names are also exempt in these ways...

+1

वाह। rtfm फिर से हमला करता है :) – OneSolitaryNoob

+0

इसे 10 वोट कैसे मिले? यह ओपी के सवाल का जवाब देने की भी कोशिश नहीं करता है! तथ्य यह है कि उन नामों के साथ पैकेज चर मौजूद हैं, उन्हें 'my' के साथ घोषित करने में असमर्थता से कोई लेना देना नहीं है। जैसे'$ a' और' $ _' को सख्त से छूट दी गई है, लेकिन उन्हें 'my' के साथ घोषित किया जा सकता है। – ikegami

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