Sdílet prostřednictvím


9. Matice

Redakční poznámka

Důležitý

specifikace jazyka Windows PowerShell 3.0 byla publikována v prosinci 2012 a je založená na prostředí Windows PowerShell 3.0. Tato specifikace neodráží aktuální stav PowerShellu. Tato dokumentace se neplánuje aktualizovat tak, aby odrážela aktuální stav. Tato dokumentace je zde uvedena pro historické reference.

Dokument specifikace je k dispozici jako dokument aplikace Microsoft Word z webu Microsoft Download Center na adrese: https://www.microsoft.com/download/details.aspx?id=36389 Dokument aplikace Word byl převeden pro prezentaci zde na webu Microsoft Learn. Během převodu byly provedeny některé redakční změny tak, aby vyhovovaly formátování pro platformu Docs. Některé překlepy a menší chyby byly opraveny.

9.1 Úvod

PowerShell podporuje pole jednoho nebo více rozměrů, přičemž každý rozměr může mít nula nebo více prvků . V rámci dimenze jsou prvky číslování ve vzestupném celočíselném pořadí počínaje nulou. K jednotlivému prvku lze přistoupit pomocí operátoru indexu pole [] (§7.1.4). Počet dimenzí v poli se nazývá jeho pořadí.

Prvek může obsahovat hodnotu libovolného typu, včetně typu pole. Pole s jedním nebo více prvky, jejichž hodnoty jsou libovolného typu pole, se nazývá jagged array. multidimenzionální pole má více dimenzí, v takovém případě je počet prvků v každém řádku dimenze stejný. Prvek zubatého pole může zahrnovat multidimenzionální pole a naopak.

Multidimenzionální pole jsou uložená v řádkově-majoritním pořadí. Počet prvků v poli se nazývá délka pole, což je pevné při vytvoření pole. Prvky v 1rozměrném poli A s délkou N lze k nim přistupovat (tj. pomocí indexu) pomocí výrazů A[0], A[1], ..., A[N-1]. Prvky v dvojrozměrném poli B s M řádky, kde každý řádek má N sloupců, lze přistupovat pomocí výrazů 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]. A tak dále pro pole se třemi nebo více dimenzemi.

Ve výchozím nastavení je pole polymorfní; tj. jeho prvky nemusí mít stejný typ. Například

$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

1-rozměrné pole má typ type[], 2-rozměrné pole má typ type[,], 3-rozměrné pole má typ type[,,]atd., kde typ je objekt pro neomezený typ pole, nebo omezený typ pro pole s omezením (§9.4).

Všechny typy pole jsou odvozeny od typu Array (§4.3.2).

9.2 Vytvoření pole

Pole je vytvořeno pomocí výrazu vytvoření pole, který má následující formy: unární operátor čárky (§7.2.1),výraz pole (§7.1.7), binární operátor čárky (§7.3), operátor rozsahu (§7.4) nebo cmdlet New-Object.

Zde je několik příkladů vytvoření a použití pole:

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

Do pipeline se zapíše následující:

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

10
False
red
10.50

Výchozí počáteční hodnota jakéhokoli prvku, který není explicitně inicializován, je výchozí hodnota pro typ daného prvku (to znamená $false, nula nebo $null).

9.3 Zřetězení polí

Pole libovolného typu a délky mohou být zřetězena pomocí operátorů + a +=, z nichž obě vedou k vytvoření nového nekontrénovaného 1rozměrného pole. Existující pole se nemění. Další informace najdete v §7.7.3 a pro diskuzi o přidání do pole omezeného typu v §9.4.

9.4 Typy omezujících prvků

Jednorozměrné pole lze vytvořit tak, že před výraz pro vytvoření pole přidáte přetypování na typ pole pro omezení typu. Například

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

Syntaxe pro vytvoření multidimenzionálního pole vyžaduje specifikaci typu a tento typ se stane typem omezení pro dané pole. Pokud však zadáte typ object[], ve skutečnosti neexistuje žádné omezení jako hodnota jakéhokoli typu lze přiřadit k prvku pole tohoto typu.

Zřetězení dvou matic (§7.7.3) vždy vede k nové matici bez omezení, i když jsou obě matice omezeny stejným typem. Například

$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 Pole jako odkazové typy

Vzhledem k tomu, že typy polí jsou odkazové typy, lze proměnnou, která označuje pole, použít k odkazu na libovolné pole libovolného typu, pořadí a délky prvků. Například

$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

Přiřazení pole je mělkou kopií; to znamená, že proměnná odkazuje na stejné pole, žádná kopie pole se nevytváří. Například

$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

Do pipeline se zapíše následující:

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

9.6 Pole jako prvky pole

Libovolný prvek pole může být sám o sobě pole. Například

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

Do pipeline se zapíše následující:

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

$list[1] odkazuje na pole 1 prvku, celé číslo 7, které je přístupné prostřednictvím $list[1][0], jak je znázorněno. Porovnejte to s následujícím dílčím případem:

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

Zde $list[1] odkazuje na skalár, celé číslo 7, které je přístupné prostřednictvím $list[1].

Podívejte se na následující příklad:

$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 Záporné indexování

To je popsáno v §7.1.4.1.

9.8 Kontrola hranic

To je popsáno v §7.1.4.1.

9.9 Maticové řezy

Maticový řez je neomezené jednorozměrné pole, jehož prvky jsou kopiemi žádného nebo více prvků z kolekce. Výřez v poli se vytvoří pomocí operátoru indexování [] (§7.1.4.5).

9.10 Kopírování pole

Souvislou sadu prvků lze zkopírovat z jednoho pole do druhého pomocí metody [array]::Copy. Například

$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 Iterace přes pole

Ačkoli je možné procházet pole a přistupovat k jeho jednotlivým prvkům pomocí operátoru dolního indexu, můžeme k přechodu přes prvky pole použít příkaz foreach. U vícerozměrného pole se prvky zpracovávají řádkově. Například

$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 Vícerozměrné pole zploštění

Některé operace s multidimenzionálním polem (například replikace (§7.6.3) a zřetězení (§7.7.3)) vyžadují, aby matice byla zploštěná; to znamená, že se má převést na 1rozměrné pole nekonstruovaného typu. Výsledné pole přebírá všechny prvky v řádkovém pořadí.

Podívejte se na následující příklad:

$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

Pole označené jako $c obsahuje prvky "červená", $true, 10, 20, 30 a 40.