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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.