Страница 2 из 2

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 18 июн 2020, 10:18
Sertik
Неважно что бета-версия. Зачем пользователю мучиться ? - скрипт должен ставиться в систему легко, автоматом.
Комментарии русские теряются при экспорте, но можно это обойти. Вот я делал, тут описано как

viewtopic.php?t=8058

Так получите текстовые файлы всех своих скриптов, потом переименуйте их в .rsc вот и всё. Их можно импортировать в любой роутер командой /import
комментарии сохранятся на русском языке
Если все вместе не превышают 4К, можно склеить в один файл .rsc

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 18 июн 2020, 11:14
pepelxl
Не много не понял о какой потере идёт речь по той ссылке. Можете разъяснить?. Потери русского при прямом копировании нет. Пример для винды:
Берёте копируете код с форума и вставляете его в notepad++. В блокноте он автоматом станет в кодировку utf. Теперь открываете winbox, открываете скрипт. УБЕЖДАЕТЕСЬ что раскладка клавиатуры в windows стоит в ОБОИХ окнах на ru. И просто делаете копировать-вставить. Работает без потерь в обе стороны.
А если надо удалить комменты или удалить только русские , то в notepad это делается одним действием. А вот если моим скриптом захочет воспользоваться человек который не знает по русски ничего, то ему эти записи как Филькина грамота, как не извлекай их из роутера. Как пример - переключи в настройках винды - используемую кодировку для программ не поддерживающих юникод

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 18 июн 2020, 22:30
Sertik
Согласен со всем. Так на кой нерусским Ваши скрипты давать. Не надо, пусть буржуи сами пишут ... :-) Наши скрипты только для нас.

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 19 июн 2020, 01:37
Sertik
Раз Вы хорошо знаете массивы, подскажите, как мне извлечь данные из многомерного массива, полученного /tool fetch в формате json вот тут:

viewtopic.php?f=14&t=11322&start=10

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 18 ноя 2022, 17:32
-13-
написал скрипт для массива
 так работает

Код: Выделить всё

/ip dhcp-client
:foreach ISP in=[find ~""] do={
    :set $interfaceISP [get $ISP interface]
    :set $nameISP [get $ISP comment]
    :set $statusISP ([get $ISP]->"status")
    :if (!any $statusISP) do={
        :set $statusISP ([/interface ethernet monitor $interfaceISP once as-value]->"status")
    }
    :set $ipISP [get $ISP address]
    :if (any $ipISP) do={
        :set $ipISP [:pick $ipISP 0 [:find $ipISP "/"]]
    } else={
        :set $ipISP $statusISP
    }
    :set ($listISP->$interfaceISP) {name=$nameISP; status=$ipISP; id=$ISP}
}

:return $listISP
 так не работает

Код: Выделить всё

/ip dhcp-client
:foreach ISP in=[find ~""] do={
    :set $interfaceISP [get $ISP interface]
    :set $nameISP [get $ISP comment]
    :set $statusISP ([get $ISP]->"status")
    :if (!any $statusISP) do={
        :set $statusISP ([/interface ethernet monitor $interfaceISP once as-value]->"status")
    }
    :set $ipISP [get $ISP address]
    :if (any $ipISP) do={
        :set $ipISP [:pick $ipISP 0 [:find $ipISP "/"]]
    } else={
        :set $ipISP $statusISP
    }
    :set ($listISP->$ISP) {name=$nameISP; status=$ipISP}
}

:return $listISP
в чем проблема?

подскажите как сделать чтобы сам собрал и пронумеровал от 0 до конца

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 18 ноя 2022, 17:52
Sertik
А вот Вы наконец и наступили на грабли, связанные с Вашей привычкой не объявлять переменные ! :hi_hi_hi:

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 18 ноя 2022, 19:07
-13-
Sertik писал(а): 18 ноя 2022, 17:52 А вот Вы наконец и наступили на грабли, связанные с Вашей привычкой не объявлять переменные ! :hi_hi_hi:
А при чем тут грабли? Скрипт массив собирает, но ключем почему то не может быть id записи, которая по сути уже переменная.

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 19 ноя 2022, 15:58
Brook
-13- писал(а): 18 ноя 2022, 17:32 написал скрипт для массива
 так работает

Код: Выделить всё

/ip dhcp-client
:foreach ISP in=[find ~""] do={
    :set $interfaceISP [get $ISP interface]
    :set $nameISP [get $ISP comment]
    :set $statusISP ([get $ISP]->"status")
    :if (!any $statusISP) do={
        :set $statusISP ([/interface ethernet monitor $interfaceISP once as-value]->"status")
    }
    :set $ipISP [get $ISP address]
    :if (any $ipISP) do={
        :set $ipISP [:pick $ipISP 0 [:find $ipISP "/"]]
    } else={
        :set $ipISP $statusISP
    }
    :set ($listISP->$interfaceISP) {name=$nameISP; status=$ipISP; id=$ISP}
}

:return $listISP
 так не работает

Код: Выделить всё

/ip dhcp-client
:foreach ISP in=[find ~""] do={
    :set $interfaceISP [get $ISP interface]
    :set $nameISP [get $ISP comment]
    :set $statusISP ([get $ISP]->"status")
    :if (!any $statusISP) do={
        :set $statusISP ([/interface ethernet monitor $interfaceISP once as-value]->"status")
    }
    :set $ipISP [get $ISP address]
    :if (any $ipISP) do={
        :set $ipISP [:pick $ipISP 0 [:find $ipISP "/"]]
    } else={
        :set $ipISP $statusISP
    }
    :set ($listISP->$ISP) {name=$nameISP; status=$ipISP}
}

:return $listISP
в чем проблема?

подскажите как сделать чтобы сам собрал и пронумеровал от 0 до конца

Если я правильно понимаю, то переменная ISP не является числом, а представляет из себя .id в виде .id=*4. Поэтому оно не может быть ключом.
Как вариант, добавьте счетчик в цикл и используйте его как индекс.

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 19 ноя 2022, 20:00
-13-
В первом варианте $interfaceISP тоже не число, но как ключ работает.
Подкиньте идею, чтоб по-порядку в массив складывало, согласно .id, в моем варианте укладывает по алфавиту.

Re: Работа с массивами или когда массив распадается на указатели

Добавлено: 20 ноя 2022, 01:24
Brook
-13- писал(а): 19 ноя 2022, 20:00 В первом варианте $interfaceISP тоже не число, но как ключ работает.
Подкиньте идею, чтоб по-порядку в массив складывало, согласно .id, в моем варианте укладывает по алфавиту.
Так вроде в сообщении выше подкинул...

В первом варианте работает как строка. Имя интерфейса $interfaceISP становится текстовым ключом, поэтому массив и сортируется.
Во втором варианте $ISP не число - это тип .id в виде .id=*4. Работать с ним в циклах можно, но id не может быть индексом в массиве.
Индексом в массиве может быть только число.

Как вариант, добавьте счетчик в цикл и используйте его как индекс.

Код: Выделить всё

:local counter 0

/ip dhcp-client
:foreach ISP in=[find ~""] do={
    :set $interfaceISP [get $ISP interface]
    :set $nameISP [get $ISP comment]
    :set $statusISP ([get $ISP]->"status")
    :if (!any $statusISP) do={
        :set $statusISP ([/interface ethernet monitor $interfaceISP once as-value]->"status")
    }
    :set $ipISP [get $ISP address]
    :if (any $ipISP) do={
        :set $ipISP [:pick $ipISP 0 [:find $ipISP "/"]]
    } else={
        :set $ipISP $statusISP
    }
    :set ($listISP->$counter) {name=$nameISP; status=$ipISP}
    
    
    :set counter ($counter + 1) 
}

:return $listISP