Перейти к содержимому
Калькуляторы

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

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

 

Знатоки! Внимание вопрос: как мне в 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. Для чего мне это надо вообще - хочется написать одну функцию, которая возвращает ассоциативный массив (ключ-значение) при этом ключи заранее неизвестны.

Изменено пользователем warez

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

: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

 

Но решение уж больно блевотное. К тому же не обладает секьюрностью данных для параллельных задач - т.к. используется глобальная переменная

Изменено пользователем warez

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

увы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем warez

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.