Compartir a través de


9. Arreglos

Nota editorial

Importante

La Especificación del lenguaje de Windows PowerShell, versión 3.0 se publicó en diciembre de 2012 y está basada en Windows PowerShell 3.0. Esta especificación no refleja el estado actual de PowerShell. No hay ningún plan para actualizar esta documentación para reflejar el estado actual. Esta documentación se presenta aquí para obtener referencia histórica.

El documento de especificación está disponible como un documento de Microsoft Word del Centro de descarga de Microsoft en: https://www.microsoft.com/download/details.aspx?id=36389 Ese documento de Word se ha convertido para su presentación aquí en Microsoft Learn. Durante la conversión, se han realizado algunos cambios editoriales para dar cabida al formato de la plataforma Docs. Se han corregido algunos errores tipográficos y menores.

9.1 Introducción

PowerShell admite matrices de una o varias dimensiones con cada dimensión con cero o más elementos . Dentro de una dimensión, los elementos se numeran en orden entero ascendente a partir de cero. Se puede acceder a cualquier elemento individual a través del operador de subíndice de matriz [] (§7.1.4). El número de dimensiones de una matriz se conoce como rango.

Un elemento puede contener un valor de cualquier tipo, incluido un tipo de matriz. Una matriz que tiene uno o varios elementos cuyos valores son de cualquier tipo de matriz se conoce como matriz escalonada. Una matriz multidimensional tiene varias dimensiones, en cuyo caso, el número de elementos de cada fila de una dimensión es el mismo. Un elemento de una matriz escalonada puede contener una matriz multidimensional y viceversa.

Las matrices multidimensionales se almacenan en orden principal de fila. El número de elementos de una matriz se denomina longitud de la matriz, que se fija cuando se crea la matriz. Por lo tanto, se puede acceder a los elementos de una matriz unidimensional A de longitud N (es decir, subíndice ) mediante las expresiones A[0], A[1], ..., A[N-1]. Los elementos de una matriz 2-dimensional B tienen M filas, con cada fila teniendo N columnas, se pueden acceder mediante las expresiones B[0,0], B[0,1], ..., B[0,N-1], B[1,0], B[1,1], ..., B[1,N-1], ..., B[M-1,0], B[M-1,1], ..., B[M-1,N-1]. Y así sucesivamente para matrices con tres o más dimensiones.

De forma predeterminada, una matriz es polimórfico ; Es decir, sus elementos no necesitan tener el mismo tipo. Por ejemplo

$items = 10,"blue",12.54e3,16.30D # 1-D array of length 4
$items[1] = -2.345
$items[2] = "green"

$a = New-Object 'object[,]' 2,2 # 2-D array of length 4
$a[0,0] = 10
$a[0,1] = $false
$a[1,0] = "red"
$a[1,1] = $null

Una matriz 1 dimensional tiene el tipo type[], una matriz 2 dimensional tiene el tipo type[,], una matriz 3 dimensional tiene el tipo type[,,], etc., donde tipo es objeto para una matriz de tipos sin restricciones o el tipo restringido para una matriz restringida (§9.4).

Todos los tipos de matriz se derivan del tipo Array (§4.3.2).

9.2 Creación de matrices

Una matriz se crea a través de una expresión de creación de matrices, que tiene las formas siguientes: operador de coma unario (§7.2.1), array-expression (§7.1.7), operador de coma binario (§7.3), operador de intervalo (§7.4) o cmdlet New-Object.

Estos son algunos ejemplos de creación y uso de matrices:

$values = 10, 20, 30
for ($i = 0; $i -lt $values.Length; ++$i) {
    "`$values[$i] = $($values[$i])"
}

$x = , 10                         # x refers to an array of length 1
$x = @(10)                        # x refers to an array of length 1
$x = @()                          # x refers to an array of length 0

$a = New-Object 'object[,]' 2, 2  # create a 2x2 array of anything
$a[0, 0] = 10                     # set to an int value
$a[0, 1] = $false                 # set to a boolean value
$a[1, 0] = "red"                  # set to a string value
$a[1, 1] = 10.50D                 # set to a decimal value
foreach ($e in $a) {              # enumerate over the whole array
    $e
}

Lo siguiente se escribe en la canalización:

$values[0] = 10
$values[1] = 20
$values[2] = 30

10
False
red
10.50

El valor inicial predeterminado de cualquier elemento no inicializado explícitamente es el valor predeterminado para el tipo de ese elemento (es decir, $false, cero o $null).

9.3. Concatenación de matrices

Las matrices de tipo arbitrario y longitud se pueden concatenar a través de los operadores + y +=, lo que da lugar a la creación de una nueva matriz 1 dimensional sin restricciones. Las matrices existentes no se modifican. Consulte §7.7.3 para obtener más información y §9.4 para obtener información sobre cómo agregar a una matriz de tipos restringidos.

9.4 Restricción de tipos de elementos

Se puede crear una matriz unidimensional para que esté restringida por tipos antefijando la expresión de creación de matriz con una conversión de tipo de matriz. Por ejemplo

$a = [int[]](1,2,3,4)   # constrained to int
$a[1] = "abc"           # implementation-defined behavior
$a += 1.23              # new array is unconstrained

La sintaxis para crear una matriz multidimensional requiere la especificación de un tipo y ese tipo se convierte en el tipo de restricción de esa matriz. Sin embargo, especificar el tipo object[]realmente no impone ninguna restricción, ya que un valor de cualquier tipo se puede asignar a un elemento de un array de ese tipo.

La concatenación de dos matrices (§7.7.3) siempre da como resultado una nueva matriz sin restricciones aunque ambas matrices estén restringidas por el mismo tipo. Por ejemplo

$a = [int[]](1,2,3)    # constrained to int
$b = [int[]](10,20)    # constrained to int
$c = $a + $b           # constraint not preserved
$c = [int[]]($a + $b)  # result explicitly constrained to int

9.5 Matrices como tipos de referencia

A medida que los tipos de matriz son tipos de referencia, se puede hacer referencia a una variable que designa una matriz para hacer referencia a cualquier matriz de cualquier rango, longitud y tipo de elemento. Por ejemplo

$a = 10,20                     # $a refers to an array of length 2
$a = 10,20,30                  # $a refers to a different array, of length 3
$a = "red",10.6                # $a refers to a different array, of length 2
$a = New-Object 'int[,]' 2,3   # $a refers to an array of rank 2

La asignación de una matriz implica una copia superficial; es decir, la variable asignada a hace referencia a la misma matriz, no se realiza ninguna copia de la matriz. Por ejemplo

$a = 10,20,30
">$a<"
$b = $a         # make $b refer to the same array as $a
">$b<"

$a[0] = 6       # change value of [0] via $a
">$a<"
">$b<"          # change is reflected in $b

$b += 40        # make $b refer to a new array
$a[0] = 8       # change value of [0] via $a
">$a<"
">$b<"          # change is not reflected in $b

Lo siguiente se escribe en la canalización:

>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<

9.6 Matrices como elementos de matriz

Cualquier elemento de una matriz puede ser una matriz. Por ejemplo

$colors = "red", "blue", "green"
$list = $colors, (,7), (1.2, "yes") # parens in (,7) are redundant; they
                                    # are intended to aid readability
"`$list refers to an array of length $($list.Length)"
">$($list[1][0])<"
">$($list[2][1])<"

Lo siguiente se escribe en la canalización:

$list refers to an array of length 3
>7<
>yes<

$list[1] hace referencia a una matriz de 1 elemento, el entero 7, al que se accede a través de $list[1][0], como se muestra. Compárelo con el siguiente caso sutilmente diferente:

$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"

Aquí, $list[1] hace referencia a un escalar, el entero 7, al que se accede a través de $list[1].

Considere el ejemplo siguiente:

$x = [string[]]("red","green")
$y = 12.5, $true, "blue"
$a = New-Object 'object[,]' 2,2
$a[0,0] = $x               # element is an array of 2 strings
$a[0,1] = 20               # element is an int
$a[1,0] = $y               # element is an array of 3 objects
$a[1,1] = [int[]](92,93)   # element is an array of 2 ints

9.7 Subíndice negativo

Esto se describe en §7.1.4.1.

9.8 Comprobación de límites

Esto se describe en §7.1.4.1.

9.9. Segmentos de matriz

Un segmento de matriz es una matriz 1 dimensional sin restricciones cuyos elementos son copias de cero o más elementos de una colección. Se crea un segmento de matriz a través del operador de subíndice [] (§7.1.4.5).

9.10 Copiar una matriz

Un conjunto contiguo de elementos se puede copiar de una matriz a otra mediante el método [Array]::Copy. Por ejemplo

$a = [int[]](10,20,30)
$b = [int[]](0,1,2,3,4,5)
[Array]::Copy($a, $b, 2)        # $a[0]->$b[0],
$a[1]->$b[1]
[Array]::Copy($a, 1, $b, 3, 2)  # $a[1]->$b[3],
$a[2]->$b[4]

9.11 Enumeración sobre una matriz

Aunque es posible recorrer una matriz accediendo a cada uno de sus elementos a través del operador de subíndice, podemos enumerar sus elementos mediante la instrucción foreach. Para una matriz multidimensional, los elementos se procesan en orden principal de fila. Por ejemplo

$a = 10, 53, 16, -43
foreach ($elem in $a) {
    # do something with element via $elem
}

foreach ($elem in -5..5) {
    # do something with element via $elem
}

$a = New-Object 'int[,]' 3, 2
foreach ($elem in $a) {
    # do something with element via $elem
}

9.12 Aplanamiento de matriz multidimensional

Algunas operaciones de una matriz multidimensional (como la replicación [§7.6.3] y la concatenación [§7.7.3]) requieren que esa matriz se aplane, es decir, que se convierta en una matriz unidimensional de tipo no restringido. La matriz resultante toma todos los elementos en orden de fila principal.

Tenga en cuenta el ejemplo siguiente:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b

La matriz designada por $c contiene los elementos "rojo", $true, 10, 20, 30 y 40.