2012-04-05 7 views
29

मैं कभी कभी देखें:कोष्ठकों के साथ मेरी का उपयोग करते हुए और इस तरह केवल एक चर पर्ल कोड

my ($variable) = blah.... 

एकल वैरिएबल के आसपास कोष्ठक डालने की बात क्या है? मैंने सोचा था कि जब कई चर घोषित करने की तरह, कोष्ठक केवल इस्तेमाल किया गया: एक पर्ल समर्थक (हर तरह से, मैं नहीं कर रहा हूँ) मैं

my ($var1, $var2, $var3) = blah... 
+2

रखरखाव के लिए यह सहायक हो सकता है, अगर यह स्पष्ट है कि एक सूची भविष्य की उम्मीद हो सकती है। मैं सामान्य रूप से इसका उपयोग करता हूं, जबकि मेरा $ arg1 = shift' – Unos

+0

की बजाय 'my ($ arg1) = @ _' जैसे subroutine तर्कों को पढ़ते समय, मैं बस 'my ('। और, एक आइटम की एक सूची टाइप करने के लिए उपयोग किया जाता हूं) अभी भी एक सूची। :) –

उत्तर

34

कई परिदृश्य हैं जब वहाँ एक अंतर है:

  1. सरणी दाईं ओर

    my @array = ('a', 'b', 'c'); 
    my $variable = @array;   # 3 size of @array 
    my ($variable) = @array;   # 'a' $array[0] 
    
  2. चालू होने पर जब सूची दाएं तरफ

    है चर (सरणी/अदिश) वापसी मान के साथ
    my $variable = qw/ a b c d /; # 'd' last item of the list 
    my ($variable) = qw/ a b c d /; # 'a' first item of the list 
    
  3. उपनेमका

    sub myFunction { 
        ... 
        return (wantarray() ? @array : $scalar); 
    } 
    my $variable = myFunction(...); # $scalar from the subroutine 
    my ($variable) = myFunction(...); # $array[0] from the subroutine 
    
+1

धन्यवाद, मुझे लगता है कि आपने कई परिदृश्य प्रदान किए हैं। –

+1

@brian d foy, मुझे आपकी टिप्पणी समझ में नहीं आ रही है। क्या आप इस पोस्ट में "सरणी" या "सूची" शब्द का दुरुपयोग करने का प्रयास कर रहे हैं? क्योंकि मुझे कोई दुरुपयोग नहीं दिख रहा है। – ikegami

6

कर रहा हूँ नहीं, लेकिन AFAIK यह सूचियों से कोई लेना देना नहीं है। पर्ल के अलग-अलग संदर्भ हैं (स्केलर, सूची)। संदर्भ संदर्भ में ($var) स्विच का उपयोग करके, $var स्केलर संदर्भ है।

my $var = (1, 2, 4); # $var = 4 (last element) 
my ($var) = (1, 2, 4); # $var = 1 

कृपया इस जवाब downvote, अगर यह पूरी तरह से गलत :)

+0

आप सही हैं, और '$ var = grep {; परिभाषित} (1, 2, 4); '= 3 (आइटम) – Axeman

+0

इसके अलावा 'मेरा @ ए = (1,2,4); मेरा $ वी = @ ए; प्रिंट $ v; '= 3 – knittl

+0

हालांकि' $ var = (1, 2, 4) '4 से 'var' असाइन करता है। 'grep' इसके संदर्भ के आधार पर एक विशिष्ट तरीके से व्यवहार करता है, और स्केलर संदर्भ में यह परीक्षण पास करने वाले सूची तत्वों की संख्या प्रदान करता है। यह स्केलर संदर्भ में एक सूची के व्यवहार से अलग है। – Borodin

18

कोष्ठकों एक सूची संदर्भ कैसे असाइनमेंट के दाहिने हाथ की ओर मूल्यांकन किया जाता है को प्रभावित करता है जो पैदा करते हैं।

my $x = grep { /s/ } qw(apples bananas cherries); 
print $x; 

तुलना करें

my ($x) = grep { /s/ } qw(apples bananas cherries); 
print $x; 

साथ आप अक्सर इस निर्माण जब you just want to grab the first element of a list and discard the rest का प्रयोग करेंगे।

+0

तकनीकी रूप से, यह इस बात को प्रभावित करता है कि असाइनमेंट ऑपरेटर के दोनों पक्षों का मूल्यांकन कैसे किया जाता है (कौन से असाइनमेंट ऑपरेटर का उपयोग किया जाता है)। – ikegami

+0

धन्यवाद, यह समझ में आता है। –

6

आप दो अलग-अलग चीजों को भ्रमित कर रहे हैं। बंद पहले, जब my का उपयोग कर कई चर घोषित करने के लिए, आप कोष्ठक का उपयोग करने की आवश्यकता है:

my $foo, $bar; 

काम नहीं करता है, क्योंकि यह दो अलग-अलग बयान माना जाता है:

my $foo; 
$bar; 

तो तुम को कोष्ठकों की जरूरत है समूह को एक साथ कार्य करने के लिए एक तर्क सूची में तर्कmy:

my($foo, $bar); 

दूसरे, आप क्रम सूची संदर्भ आह्वान करने के लिए में स्पष्ट समूहीकरण है:

$foo, $bar = "a", "b"; # wrong! 

तीन अलग-अलग बयानों पर विचार किया जाएगा:

$foo; 
$bar = "a"; 
"b"; 

लेकिन अगर आप एक सूची में समूह $foo और $bar लिए कोष्ठक का उपयोग, असाइनमेंट ऑपरेटर एक सूची संदर्भ का उपयोग करेगा: मजे की बात है, अगर आप आरएचएस कोष्ठकों निकालने के लिए,

($foo, $bar) = ("a", "b"); 

आप भी अनुभव होगा एक hickup:

($foo, $bar) = "a", "b"; # Useless use of a constant (b) in void context 

लेकिन है कि क्योंकि = ऑपरेटर अल्पविराम ,, जो आप perlop में देख सकते हैं की तुलना में अधिक पूर्वता है। यदि आप कोशिश करते हैं:

my @array = ("a", "b"); 
($foo, $bar) = @array; 

आपको बिना किसी ब्रांड्स के वांछित व्यवहार प्राप्त होगा।

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

my @array = ("a", "b"); 
$foo = @array; 
print $foo; 

यह 2 प्रिंट, क्योंकि सरणी अदिश संदर्भ में मूल्यांकन किया जाता है, और अदिश संदर्भ में सरणियों वापसी उनमें शामिल तत्वों की संख्या। इस मामले में, यह 2 है।

इसलिए, इस तरह के इन उपयोग सूची संदर्भ के रूप में बयान:

my ($foo) = @array;   # $foo is set to $array[0], first array element 
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element 

यह अदिश संदर्भ में जो अदिश काम में निहित है अधिभावी का एक तरीका है। तुलना के लिए, इन असाइनमेंट अदिश संदर्भ में कर रहे हैं:

my $foo = @array;   # $foo is set to the number of elements in the array 
my $bar = ("a", "b", "c"); # $bar is set to "c", last list element 
+0

दिलचस्प है, 'मेरा $ foo = ("a", "b"); प्रिंट करें $ foo; '' b' प्रिंट करेगा, और '2' – knittl

+0

@knittl जितना दिलचस्प लगता है उतना दिलचस्प नहीं है, क्योंकि केवल * arrays * में वह व्यवहार है, सूचीबद्ध नहीं है। स्केलर संदर्भ में, सूचियां इसके बजाय अपना अंतिम तत्व लौटाती हैं। – TLP

+1

[perlfaq4: सूची और सरणी के बीच क्या अंतर है?] (Http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array % 3 एफ) –

2

मैं पोस्ट किया है बारे में गहराई से किसी अन्य साइट पर इस विषय पर explanation

[मैं इसे यहां पोस्ट नहीं कर सकता। StackOverflow टेबल का समर्थन नहीं करता है। ऐसा नहीं है कि किसी को आम तौर पर दस्तावेज से जुड़े ऑफसाइट के साथ समस्या हो सकती है।]

+0

डाउनवोट क्यों? – ikegami

+1

स्पष्ट रूप से किसी को दस्तावेज के साथ ऑफसाइट कनेक्ट करने में कोई समस्या है। मैं आमतौर पर आपके उत्तर में सारांश जोड़ने की सलाह देता हूं। –

+0

@ ब्रैड गिल्बर्ट, जो कुछ भी पहले से कहा गया था उसे दोहराएं, जहां तक ​​मेरा संबंध है, अच्छी बात नहीं है। – ikegami

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