Pull to refresh

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]"]]

и другие всевозможные варианты ... Не работает. Как можно решить эту задачу ?

Sign up to leave a comment.

Articles