Partilhar via


9. Matrizes

Nota editorial

Importante

O Windows PowerShell Language Specification 3.0 foi publicado em dezembro de 2012 e é baseado no Windows PowerShell 3.0. Esta especificação não reflete o estado atual do PowerShell. Não há nenhum plano para atualizar esta documentação para refletir o estado atual. Esta documentação é apresentada aqui para referência histórica.

O documento de especificação está disponível como um documento do Microsoft Word no Centro de Download da Microsoft em: https://www.microsoft.com/download/details.aspx?id=36389 Esse documento do Word foi convertido para apresentação aqui no Microsoft Learn. Durante a conversão, algumas alterações editoriais foram feitas para acomodar a formatação da plataforma do Documentos. Alguns erros de digitação e pequenos erros foram corrigidos.

9.1 Introdução

O PowerShell dá suporte a matrizes de uma ou mais dimensões com cada dimensão tendo zero ou mais elementos . Dentro de uma dimensão, os elementos são numerados em ordem inteira crescente começando em zero. Qualquer elemento individual pode ser acessado através do operador subscrito da matriz [] (§7.1.4). O número de dimensões em uma array é chamado de ordem.

Um elemento pode conter um valor de qualquer tipo, incluindo um tipo de matriz. Uma matriz com um ou mais elementos cujos valores são de qualquer tipo de matriz é chamada de matriz irregular . Uma matriz multidimensional tem várias dimensões, nesse caso, o número de elementos em cada linha de uma dimensão é o mesmo. Um elemento de uma matriz irregular pode conter uma matriz multidimensional, e o contrário também.

As matrizes multidimensionais são armazenadas em ordem de linha principal. O número de elementos em uma matriz é chamado de comprimento de dessa matriz, que é fixo quando a matriz é criada. Como tal, os elementos numa matriz unidimensional A com comprimento N podem ser acessados (subscrito ) usando as expressões A[0], A[1], ..., A[N-1]. Os elementos em uma matriz de 2 dimensões B com M linhas, com cada linha tendo N colunas, podem ser acessados usando as expressões 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]. E assim por diante para matrizes com três ou mais dimensões.

Por padrão, uma matriz é polimórfica; ou seja, seus elementos não precisam ter todos o mesmo tipo. Por exemplo

$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

Uma matriz de 1 dimensão tem o tipo type[], uma matriz de 2 dimensões tem o tipo type[,], uma matriz de 3 dimensões tem o tipo type[,,], e assim por diante, onde tipo é objeto para uma matriz de tipo não restringida, ou o tipo restrito para uma matriz restrita (§9.4).

Todos os tipos de matriz são derivados do tipo Array (§4.3.2).

9.2 Criação de matrizes

Uma matriz é criada por meio de uma expressão de criação de matriz , que tem as seguintes formas: operador de vírgula unária (§7.2.1), expressão de matriz (§7.1.7), operador de vírgula binária (§7.3), operador de intervalo (§7.4), ou cmdlet New-Object .

Aqui estão alguns exemplos de criação e uso de matrizes:

$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
}

O seguinte é gravado na canalização:

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

10
False
red
10.50

O valor inicial padrão de qualquer elemento não explicitamente inicializado é o valor padrão para o tipo desse elemento (ou seja, $false, zero ou $null).

9.3 Concatenação de matrizes

Matrizes de tipo e comprimento arbitrários podem ser concatenadas através dos operadores + e +=, que resultam na criação de uma nova matriz 1-dimensional sem restrições. As matrizes existentes permanecem inalteradas. Consulte §7.7.3 para obter mais informações e §9.4 para uma discussão sobre como adicionar a uma matriz de tipo restrito.

9.4 Tipos de elementos restritivos

Uma matriz unidimensional pode ser criada de forma a ser restrita a um tipo específico, prefixando a expressão de criação da matriz com um casting para o tipo de matriz. Por exemplo

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

A sintaxe para criar uma matriz multidimensional requer a especificação de um tipo, e esse tipo se torna o tipo de restrição para essa matriz. No entanto, especificando o tipo object[], realmente não há nenhuma restrição, pois um valor de qualquer tipo pode ser atribuído a um elemento de uma matriz desse tipo.

A concatenação de duas matrizes (§7.7.3) sempre resulta em uma nova matriz que não é restringida, mesmo que ambas as matrizes sejam restritas pelo mesmo tipo. Por exemplo

$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 Matrizes como tipos de referência

Como os tipos de matriz são tipos de referência, uma variável que designa uma matriz pode ser feita para se referir a qualquer matriz de qualquer classificação, comprimento e tipo de elemento. Por exemplo

$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

A atribuição de uma matriz envolve uma cópia superficial; ou seja, a variável atribuída a refere-se à mesma matriz, nenhuma cópia da matriz é feita. Por exemplo

$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

O seguinte é registado no pipeline:

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

9.6 Matrizes como elementos de matriz

Qualquer elemento de uma matriz pode ser uma matriz. Por exemplo

$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])<"

O seguinte é escrito no pipeline:

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

$list[1] refere-se a uma matriz de 1 elemento, o inteiro 7, que é acessado via $list[1][0], como mostrado. Compare isso com o seguinte caso sutilmente diferente:

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

Aqui, $list[1] refere-se a um escalar, o inteiro 7, que é acessado via $list[1].

Considere o exemplo a seguir,

$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 Subscrição negativa

Esta questão é discutida no §7.1.4.1.

9.8 Verificação de limites

Esta questão é discutida no §7.1.4.1.

9.9 Fatias de matriz

Uma de fatia de matriz é uma matriz 1-dimensional sem restrições cujos elementos são cópias de zero ou mais elementos de uma coleção. Uma secção de matriz é criada através do operador de índice [] (§7.1.4.5).

9.10 Copiando uma matriz

Um conjunto contíguo de elementos pode ser copiado de uma matriz para outra usando o método [Array]::Copy. Por exemplo

$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 Enumerando em uma matriz

Embora seja possível percorrer uma matriz acessando cada um dos seus elementos através do operador de índice, podemos percorrer os elementos dessa matriz usando a declaração foreach. Para uma matriz multidimensional, os elementos são processados em ordem de linha maior. Por exemplo

$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 Achatamento de matrizes multidimensionais

Algumas operações em uma matriz multidimensional (como replicação (§7.6.3) e concatenação (§7.7.3)) exigem que a matriz seja achatada; ou seja, seja transformada em uma matriz 1-dimensional de tipo não restrito. A matriz resultante assume todos os elementos em ordem de linha principal.

Considere o seguinte exemplo:

$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

A matriz designada por $c contém os elementos "vermelho", $true, 10, 20, 30 e 40.