任何人都可以解释为什么第一个例子得到的结果不同于以下2

时间:2011-03-13 05:55:09

标签: powershell

$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

更新

我认为在#powershell IRC上我们已经解决了这个问题,这是另一个例子,它演示了在多行中列出数组中多个项目时,在下一行而不是顶行的情况下破解逗号的危险。

$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         

我很好奇人们会如何解释这一点。我想我现在理解它,但是以简洁易懂的方式解释它会有困难,尽管上面的例子有点朝着这个目标。

1 个答案:

答案 0 :(得分: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

如果有人可以发布一个明确解释后两个例子行为的链接,我会看到它!