warez 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 Share this post Link to post Share on other sites More sharing options...
warez 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 Share this post Link to post Share on other sites More sharing options...
warez Posted October 26, 2016 собственно саппорт МикроТика ответил, что использование в данном месте переменной к сожалению недопустимо. :local a {"$key"="$val"}; увы. Share this post Link to post Share on other sites More sharing options...
warez 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 Share this post Link to post Share on other sites More sharing options...