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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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

viewtopic.php?t=8058

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

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


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

написал скрипт для массива
 так работает

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

/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 до конца


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

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


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

-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. Поэтому оно не может быть ключом.
Как вариант, добавьте счетчик в цикл и используйте его как индекс.


-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

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


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

-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


Ответить