PowerShell для програміста

Про що і навіщо цей сайт я поки що не вирішив. Вважатимемо це тестуванням Wordpress

PowerShell для програміста Масив масивів у PowerShell

Вже кілька разів зіткнувся з особливостями створення різних ієрархій у вигляді масивів та хешів. І якщо з асоціативними масивами (хешами) проблем зазвичай немає, то ось зі звичайними вже як карта ляже. Проблема в тому, що PowerShell намагається додумувати та незримо конвертувати типи. Вирішив увічнити загалом.

Як думаєте, що буде результатом виразу: $a = @(1,2,3,@(4,5,6))

Правильно! Одновимірний масив @ (1,2,3,4,5,6)

А ось що б не відбулося об'єднання масивів, а все ж таки 4-й елемент став саме вкладеним масивом треба додати магічну кому: $a = @(1,2,3,, @(4, 5,6))

Власне, скрізь де ми хочемо щоб масив залишився масивом, найпростіший варіант це додати кому попереду. Можна, звичайно, працювати з яким-небудь C# масивом/колекцією (відповідним чином оголосивши) і там проблем не буде.

Нижче повний код скрипту, де реалізовані приклади вкладених масивів і хешів на прикладі найпростішої рекурсивної функції. Для наочності результату зробив перетворення на JSON. Конструкції-replace “\s”,”” – реалізують мініфікацію, можна прибрати – буде розгорнутий JSON

Багато магії ось у цьому рядку: $la += ,@((RecursionArray -deep ($deep-1)), “Iteration $deep”)

А перед нею кома, щоб останній (глибокий) елемент саме вклався в передостанній, а не додався до передостаннього масиву: $la += @((RecursionArray -deep ($deep-1)),$deep) [[[[1,2],3],4],5] (собаку можна було і не ставити, тут навіть PoSh-у відомо що це масив)

Ну а з собакою та комою, навіть одноелементне вкладеннямасивів побудується правильно: $la += ,@(RecursionArray -deep ($deep-1)) [[[[[]]]]]

Загалом, особисто моя практика говорить про те, що з масивами PowerShell потрібно працювати максимально обережно. Набагато простіше використовувати хеші.