none
Объясните по массивам PoSH RRS feed

  • Вопрос

  • Всем привет!

    Хочу создать массив нефиксированной длины для 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 Mishechkin
    1 декабря 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
  • массивы в 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