Jump to content
Калькуляторы

Установить имя ключа элемента ассоциативного массива гуру микротик скриптинга - откликнитесь

Головоломка для гуру скриптинга Микротик:

 

Знатоки! Внимание вопрос: как мне в 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 by warez

Share this post


Link to post
Share on other sites

Как вариант кривого решения добавить такую глобальную функцию

: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 by warez

Share this post


Link to post
Share on other sites

собственно саппорт МикроТика ответил, что использование в данном месте переменной к сожалению недопустимо.

:local a {"$key"="$val"};

увы.

Share this post


Link to post
Share on other sites

Пока мылся в душе случайно нашел скрытое решение! Можно добавлять динамически элементы в массив используя оператор 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 by warez

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now