warez Posted October 25, 2016 Posted October 25, 2016 (edited) Головоломка для гуру скриптинга Микротик: Знатоки! Внимание вопрос: как мне в run-time в скрипте в RouterOS установить значение ключа элемента ассоциативного массива из переменной? Простой вариант { :local array {"key"="value"}; :put ($array->"key"); } Вывод: value Хочется "key" и "value" брать из переменных :local key "mykey"; :local val "value"; # В след строке не работает как хотелось бы $key! :local array {"$key"="$val"}; #при этом вполне работает получение элемента по ключу из переменной :put ($array->$key); уже сломал всю голову. юзал скобки, кавычки, $баксы - получается "$key"="$val" логическое выражение. Кое как громоздко можно сделать через команду :parse - но получается очень стремный код. P.S. Для чего мне это надо вообще - хочется написать одну функцию, которая возвращает ассоциативный массив (ключ-значение) при этом ключи заранее неизвестны. Edited October 25, 2016 by warez Вставить ник Quote
warez Posted October 25, 2016 Author Posted October 25, 2016 (edited) Как вариант кривого решения добавить такую глобальную функцию :global Pair do={ # :global gRet ""; :local str ":global gRet; :set gRet {\"$1\"=\"$2\"};"; :local func [:parse $str]; $func; :return $gRet; } Потом мы можем делать так: { :local key "MySuperKey"; :local val "MyValue"; :local x [$Pair $key $val]; :put $x; :put [typeof $x]; :put ($x->$key); } Вывод: MySuperKey=MyValue array MyValue Но решение уж больно блевотное. К тому же не обладает секьюрностью данных для параллельных задач - т.к. используется глобальная переменная Edited October 25, 2016 by warez Вставить ник Quote
warez Posted October 26, 2016 Author Posted October 26, 2016 собственно саппорт МикроТика ответил, что использование в данном месте переменной к сожалению недопустимо. :local a {"$key"="$val"}; увы. Вставить ник Quote
warez Posted October 31, 2016 Author Posted October 31, 2016 (edited) Пока мылся в душе случайно нашел скрытое решение! Можно добавлять динамически элементы в массив используя оператор set - если элемент с ключом не существовал - то он добавляется! { :local key1 "MyKey1"; :local key2 "MyKey2"; :local val1 "MyValue1"; :local val2 "MyValue2"; :local a ({}); # Dynamic add element! :-) :set ($a->$key1) $val1; :set ($a->$key2) $val2; :put $a; :put [:len $a]; :put ($a->$key1); :put ($a->$key2); } Вывод: MyKey1=MyValue1;MyKey2=MyValue2 2 MyValue1 MyValue2 Edited October 31, 2016 by warez Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.