warez Опубликовано 25 октября, 2016 (изменено) · Жалоба Головоломка для гуру скриптинга Микротик: Знатоки! Внимание вопрос: как мне в 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. Для чего мне это надо вообще - хочется написать одну функцию, которая возвращает ассоциативный массив (ключ-значение) при этом ключи заранее неизвестны. Изменено 25 октября, 2016 пользователем warez Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
warez Опубликовано 25 октября, 2016 (изменено) · Жалоба Как вариант кривого решения добавить такую глобальную функцию :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 Но решение уж больно блевотное. К тому же не обладает секьюрностью данных для параллельных задач - т.к. используется глобальная переменная Изменено 25 октября, 2016 пользователем warez Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
warez Опубликовано 26 октября, 2016 · Жалоба собственно саппорт МикроТика ответил, что использование в данном месте переменной к сожалению недопустимо. :local a {"$key"="$val"}; увы. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
warez Опубликовано 31 октября, 2016 (изменено) · Жалоба Пока мылся в душе случайно нашел скрытое решение! Можно добавлять динамически элементы в массив используя оператор 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 Изменено 31 октября, 2016 пользователем warez Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...