Лучший отвечающий
Объясните по массивам PoSH

Вопрос
-
Всем привет!
Хочу создать массив нефиксированной длины для IP-адресов и руками его заполнить.
Делаю так:
[string[]]$arrIPs
$arrIP[0] = "192.168.0.1"
$arrIP[1] = "192.168.0.2"
Получаю ругань:
Не удается индексировать в массив NULL.
строка:2 знак:12
+ $arrIPs[ <<<< 0] = "192.168.0.1"
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
Не удается индексировать в массив NULL.
строка:3 знак:12
+ $arrIPs[ <<<< 1] = "192.168.0.2"
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArrayЛадно пойдем другим путем:
[string[]]$arrIPs = @{}
$arrIP[0] = "192.168.0.1"
$arrIP[1] = "192.168.0.2"
На это раз такая хрень:
Произошла ошибка при назначении массива, так как индекс "1" находится вне пределов допустимого диапазона.
строка:3 знак:12
+ $switchIPs[ <<<< 1] = [string]"192.168.0.2"
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : IndexOutOfRange
Пожста разъясните как правильно ?
Andrew Mishechkin1 декабря 2010 г. 6:40
Ответы
-
PS(8)> $arrIPs=@()
PS(9)> $arrIPs+="192.168.0.1"
PS(10)> $arrIPs
192.168.0.1
PS(11)> $arrIPs+="192.168.0.2"
PS(12)> $arrIPs
192.168.0.1
192.168.0.2
blog: http://shss.wordpress.com/- Помечено в качестве ответа Andy Mishechkin 1 декабря 2010 г. 11:05
1 декабря 2010 г. 9:08
Все ответы
-
PS(8)> $arrIPs=@()
PS(9)> $arrIPs+="192.168.0.1"
PS(10)> $arrIPs
192.168.0.1
PS(11)> $arrIPs+="192.168.0.2"
PS(12)> $arrIPs
192.168.0.1
192.168.0.2
blog: http://shss.wordpress.com/- Помечено в качестве ответа Andy Mishechkin 1 декабря 2010 г. 11:05
1 декабря 2010 г. 9:08 -
массивы в PoSh имеею фиксированную длинну.
При выполнении операции добавления элемента к массиву (+ или +=) на самом деле создается новый массив достаточного размера, в который копируется содержимое старого массива и новый элемент.
blog: http://shss.wordpress.com/1 декабря 2010 г. 9:16 -
А так еще и удалять можно:
$Arr = New-Object system.collections.arraylist
$Arr.Add("Test")
$Arr.Remove("Test")Ну и быстрее еще почти в два раза:
PS D:\Temp> (measure-command {1..200|%{$arr = New-Object system.collections.arraylist; 1..1000|%{$arr.add($_)}}}).totals
econds
15,3024958
PS D:\Temp> (measure-command {1..200|%{$arr = @(); 1..1000|%{$arr += $_}}}).totalseconds
26,2423691>массивы в PoSh имеею фиксированную длинну
Не совсем так. На уровне PS то они как раз не фиксированные, а вот если брать глубже, даже глубже чем NET - то тогда да, массивы на самом деле статичной длинны, потому как при выделении памяти отмечается начало блока данных в памяти, и его длинна. Увеличить потом разумеется уже не получится - так как дальше память уже может быть занята другими данными.
AKA Xaegr, MVP: PowerShell Блог: http://xaegr.wordpress.com- Предложено в качестве ответа Vasily GusevModerator 1 декабря 2010 г. 16:01
1 декабря 2010 г. 16:00Модератор -
имеею фиксированную длинну
Не совсем так. На уровне PS то они как раз не фиксированные, а вот если брать глубже, даже глубже чем NET - то тогда да, массивы на самом деле статичной длинны, потому как при выделении памяти отмечается начало блока данных в памяти, и его длинна. Увеличить потом разумеется уже не получится - так как дальше память уже может быть занята другими данными."Обратимся к Марксу" (сиречь, к Bruce Payette'у ;)): "Attempts to assign outside the bounds of an array will result in a range error. This is because PowerShell arrays are based on .NET arrays and they are of fixed size. So how can I add more elements to a PowerShell array if the underlying objects are fixed in size? In fact, this is easily done through array concatenation using the plus (“+”) or plus-equals (“+=”) operators."
В общем, если уж низлежащие объекты (.Net массивы) имеют фиксированную длину, то это накладывает определенные ограничения и на вышележащие PoSh-объекты. По крайней мере, "добавление" элементов к массиву в чистом виде невозможно. Добавление элемента производится через создание нового объекта и копирование в него элементов исходного. Называть это динамическим массивом, ну, никак не возвозможно. Элемент, конечно, как бы добавляется, но де-факто, результатом операции является не измененный оригинальный объект, а вновь созданный.
blog: http://shss.wordpress.com/1 декабря 2010 г. 20:55