2011-03-13 17 views
6
 
$b = (2,3) 

$myarray1 = @(,$b,$b) 

$myarray1[0].length #this will be 1 
$myarray1[1].length 

$myarray2 = @(
,$b 
,$b 
) 

$myarray2[0].length #this will be 2 
$myarray[1].length 

$myarray3 = @(,$b 
,$b 
) 

$myarray3[0].length #this will be 2 
$myarray3[1].length 

अद्यतनकिसी को भी क्यों 1 उदाहरण निम्नलिखित 2

मैं #powershell आईआरसी हम इस पर काम किया है पर लगता है की तुलना में अलग परिणाम प्राप्त होता है व्याख्या कर सकते हैं, यहाँ एक और उदाहरण है कि के खतरे को दर्शाता है है एकाधिक लाइनों पर एक सरणी में एकाधिक आइटम सूचीबद्ध करते समय शीर्ष पंक्ति की बजाय निम्न पंक्ति पर कॉमा के साथ तोड़ना।

 
$b = (1..20) 

$a = @($b, $b ,$b, 
     $b, $b ,$b) 

for($i=0;$i -lt $a.length;$i++) 
{ 
    $a[$i].length 
}   
"--------" 
$a = @($b, $b ,$b 
     ,$b, $b ,$b) 

for($i=0;$i -lt $a.length;$i++) 
{ 
    $a[$i].length 
}   

 
20 
20 
20 
20 
20 
20 
-------- 
20 
20 
20 
1 
20 
20 

वास्तव में पैदा करता है बल्कि यह है कि नेस्टेड सरणियों कि इसे यहाँ को मुश्किल हो सकती है का उपयोग कर पूर्णांकों

 
$c = @(1 , 2 , 
     3 , 4) 
for($i=0;$i -lt $c.length;$i++) 
{ 
    $c[$i].gettype() 
}   
"---------" 
$c = @(1 , 2 
     , 3 , 4) 
for($i=0;$i -lt $c.length;$i++) 
{ 
    $c[$i].gettype() 
}   

का एक सरल सरणी और परिणाम है

 
IsPublic IsSerial Name          BaseType                              
-------- -------- ----          --------                              
True  True  Int32         System.ValueType                            
True  True  Int32         System.ValueType                            
True  True  Int32         System.ValueType                            
True  True  Int32         System.ValueType                            
--------- 
True  True  Int32         System.ValueType                            
True  True  Int32         System.ValueType                            
True  True  Object[]         System.Array                             
True  True  Int32         System.ValueType   

मैं उत्सुक हूँ कि कैसे लोग इसे समझाएंगे। मुझे लगता है कि मैं इसे अब समझता हूं, लेकिन इसे संक्षिप्त समझने योग्य फैशन में समझाने में परेशानी होगी, हालांकि उपर्युक्त उदाहरण कुछ हद तक उस लक्ष्य की ओर जाता है।

+0

एकमात्र औचित्य जिसे मैं सोच सकता हूं वह यह है कि यह पार्सर में एक बग है। ऐसा प्रतीत नहीं होता है कि इस तरह से व्यवहार करना चाहिए। – zdan

उत्तर

3

मैं पहले उदाहरण की व्याख्या कर सकता हूं, लेकिन दूसरे दो नहीं। यूनरी कॉमा ऑपरेटर (http://rkeithhill.wordpress.com/2007/09/24/effective-powershell-item-8-output-cardinality-scalars-collections-and-empty-sets-oh-my/ देखें) एक सदस्य के साथ एक सरणी बनाता है, इसलिए ,$b एक सरणी बनाता है जिसमें ($b) है; ,$b,$b एक सरणी बनाता है जिसमें (,$b और $b) शामिल हैं।

दूसरे दो उदाहरण, मेरा मानना ​​है कि, एक तत्व के साथ एक सरणी बना रहे हैं जिसमें $b,$b है। फिर एक-तत्व सरणी चपटा हो जाती है, केवल $b,$b प्रदान करती है।

यदि कोई व्यक्ति दूसरे दो उदाहरणों के व्यवहार को निश्चित रूप से समझाते हुए एक लिंक पोस्ट कर सकता है, तो मैं इसे देखने के लिए प्यार प्यार करता हूं!

+0

तो आप इस प्रश्न में जोड़े गए हाल के उदाहरणों के बारे में क्या सोचते हैं? – klumsy

+0

@klumsy: आप एक सरणी * या * एक अल्पविराम के साथ एक सरणी को सीमित कर सकते हैं। ऐसा प्रतीत होता है कि जब आप एक ही सरणी में कॉमा और न्यूलाइन दोनों का उपयोग करते हैं तो यह डीडब्ल्यूआईएम की कोशिश करता है और कभी-कभी भ्रमित परिणाम भी देता है। – Gabe

+0

यह काफी नहीं है .. जब तक लाइन के सिरों पर कोई अल्पविराम नहीं होता है, तो पावरहेल को बताएं कि जो भी अगली पंक्ति पर है, वह एक ही कथन का हिस्सा होना चाहिए जो प्रत्येक पंक्ति को एक अलग कथन के रूप में मानता है, उन्हें अलगाव में मूल्यांकन करता है, फिर @() – klumsy

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