2009-09-07 5 views
8

Tengo la siguiente función de PowerShell que funciona bien para cualquier entrada excepto para 1. Si le paso una entrada de 1, devolverá una matriz con dos elementos 1,1 en lugar de un único elemento que a su vez es una matriz de dos elementos (1,1).La matriz de Jagged PowerShell está perdiendo una dimensión cuando solo existe un elemento

¿Alguna idea de cómo puedo hacer que PowerShell devuelva una matriz dentada con un elemento que a su vez es una matriz?

function getFactorPairs { 
    param($n) 
    $factorPairs = @() 
    $maxDiv = [math]::sqrt($n) 
    write-verbose "Max Divisor: $maxDiv" 
    for($c = 1; $c -le $maxDiv; $C++) { 
     $o = $n/$c; 
     if($o -eq [math]::floor($o)) { 
      write-debug "Factor Pair: $c, $o" 
      $factorPairs += ,@($c,$o) # comma tells powershell to add defined array as element in existing array instead of adding array elements to existing array 
     } 
    } 
    return $factorPairs 
} 

Aquí es mi prueba y es la salida que muestra el problema. Puede ver que el primer ejemplo (1 como entrada) devuelve una longitud de 2, aunque solo se encontró un par de factores. El segundo ejemplo (6 como entrada) funciona correctamente y devuelve una longitud de 2 con dos pares de factores encontrados.

~» (getFactorPairs 1).length 
    DEBUG: Factor Pair: 1, 1 
    2 

~» (getFactorPairs 6).length 
    DEBUG: Factor Pair: 1, 6 
    DEBUG: Factor Pair: 2, 3 
    2 

Respuesta

12

Probé esto en el PowerShell V2 CTP en Windows XP, y vi los mismos resultados que el OP.

El problema parece ser el hábito de PowerShell de "acoplar" las colecciones a medida que pasan a lo largo de la tubería. Una solución sencilla es envolver el valor de retorno en una colección por prologar la expresión para ser devuelto con el operador coma así:

return ,$factorPairs 

Ver el blog de Keith Hill entrada Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My! para un poco más de detalle.

Espero que esto ayude.

+0

Great workround y excelente enlace, y el error parece haberse solucionado (https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99) presumiblemente en PowerShell v3 –

5

Estás cerca. El problema al que se está enfrentando es que PowerShell desenrolla (aplana) la matriz cuando se devuelve desde la función. Utilice el operador de coma para devolver la matriz como está sin desenrollarlo:

return ,$factorPairs 

Cuando sólo hay un elemento de la matriz, que es el caso para las entradas 1,2,3 y otros números primos, PowerShell desenrolla la contenido de la matriz en la salida para que cada elemento (1,1) aparezca en la salida. ¿Por qué PowerShell desenrolla tanto la matriz externa como la interna en este caso? No estoy seguro. Sospecho que lo hacen porque hay escenarios donde la gente esperaría este comportamiento de PowerShell.

Cuestiones relacionadas