Как мне выполнить операции с числовыми строками внутри массива (в powershell)? - PullRequest
1 голос
/ 22 октября 2019

Допустим, моя переменная $a - это массив, содержащий "1" и "2" в виде строки.

$ a = "1", "2"

Теперь я хочу использовать foreach через конвейер, чтобы вычесть 1 из каждого значения, поэтому я бы сделал что-то вроде

$ a |foreach {$ _ = [int] $ _ - 1}

, но это, похоже, ничего не делает, но не выдает ошибки. Так что $a все еще содержит «1» и «2». Я изо всех сил пытаюсь понять, где я ошибся ... Это возможно, если у меня нет массива, поэтому это работает:

$ b = "3";$ b - 2

И он вернется 1. Итак, я также попытался без «[int]», но все равно не получилось, поэтому я предполагаю, что это связано либо с конвейером, либо с моим foreach но я бы не знал, почему это так.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

Ваш foreach не изменяет элементы в вашем исходном массиве, как вы думаете - вы присваиваете вычисленное значение контекстной переменной $_, а не обновляете индекс массива.

Вы можете создать новый массив с вычисленными значениями следующим образом:

$a = $a | foreach { [int]$_ - 1 }

или изменить элементы в исходном массиве на месте:

for( $i = 0; $i -lt $a.Length; $i++ )
{
    $a[$i] = [int]$a[$i] - 1
}

Обратите внимание, что ваш второй пример нене вполне то, что вы думаете:

PS> $b = "3"; $b - 2
1
PS> $b
3

$b - 2 часть - это выражение , которое вычисляется и выводится на консоль - оно не меняет значение $b потому что вы не присвоили результат выражения обратно ни к чему.

0 голосов
/ 22 октября 2019

Просто добавьте переменную экземпляра в последнюю строку вашего цикла следующим образом:

$a = $a | foreach{$_ = [int]$_ - 1; $_}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...