Comments 8
Прекрасная и очень глубокая статья ! Автору, как всегда, респект ! Я знаю и другие его работы. Не перестаю также его благодарить за JSON-парсер для РОС Микротик https://habr.com/ru/post/337978/
Вопрос к автору:
Допустим есть:
:local line "2 5 var=mama"
:local scrname "myScript"
так не работает:
[[:parse [/system script get $scrname source]] $line]
А так работает:
[[:parse [/system script get $scrname source]] 2 5 var=mama]
Как мне представить $line чтобы вместо неё подставилось её значение ?
Проблема в том, что скрипт myScript запускается в обоих примерах, НО ! в примере 2 параметры (указанные явно !) нормально передаются скрипту в количестве 3=х (два позиционных и один именной).
А в примере 1 переменная $line содержит в себе все три параметра и в скрипт myScript передаётся как один (первый) строковый параметр, соответственно остальные два ожидаемых остаются пустыми.
Не хочется в myScript выделять параметры из строки, должно быть нормальное другое решение ...
Это не простая задача, так как список аргументов - это, конечно, совсем не строка. Но я еще поэкспериментировал, и вот что получилось. Было очень не просто сделать это. Указать строку как список параметров для вызова скрипта (или функции) можно, если применить еще раз парсинг (:parse) над общим выражение вызова. Вообще на мой взгляд это очень усложняет код, и по возможности лучше избегать таких наслоений логик. Возможно можно еще оптимизировать выражение, но я, пожалуй, тут остановлюсь.
[admin@MikroTik] > :local line "2 5 var=mama"; :put [:parse "[:parse [/system script get myScript source]] $line"]
(<%% (evl /parsevalue=(evl (evl /system/script/getnumber=myScript;value-name=source))) 2;5;var=mama)
[admin@MikroTik] > :local line "2 5 var=mama"; :put [[:parse "[:parse [/system script get myScript source]] $line"]]
test 2
test 5
mama
result 2 5 mama 7.1rc5 (testing)
Проверил, Ваш вариант работает на 100%. Вы гений ! Низки
Низкий поклон и ещё раз огромное спасибо. Напишите, мне, пожалуйста, пару строк на svserkov@nsi.ru чтобы я мог Вам написать "в личку". Понимая Вашу занятость зря отвлекать не буду. С уважением, Sertik.
Ещё один вопрос к гуру:
Допустим в окружении есть активная функция FuncMama и я хочу "передать" её код новой функции FuncPapa (т.е. FuncPapa должна "унаследовать" код функции FuncMama). Это можно сделать простым объявлением или присваиванием (:set):
:global FuncMama; :global FuncPapa $FuncMama
или
:global FuncMama; :global FuncPapa; :set FuncPapa $FuncMama:
Теперь FuncPapa содержит тот же код, что и FuncMama и может быть исполнена:
[$FuncPapa]. Функции стали копиями.
Мне же нужно сделать в скрипте то же самое, но в случае, когда имена функций FuncMama и FuncPapa содержатся в переменных (то есть заранее не известны).
пробовал:
[[:parse ":global $func; :global $command [:parse $func]"]]
и другие всевозможные варианты ... Не работает. Как можно решить эту задачу ?
Особенности функций Mikrotik script. Сode из :parse