Помощь в создании именованного массива

Обсуждение ПО и его настройки
Ответить
pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

Надо создать именованный трёхмерный массив. Топчусь третий день, не могу найти ошибку.
заранее не известны название ключей, по этому их надо добавлять в процессе работы.
Пример который работает:

Код: Выделить всё

:local key1 "D04DEA1091709160632421214";
:local key2 "D04DEA34224EB3D99170915112732146";
:local key3 3;
:local key4 4;
:local val1 "MyValue1";
:local val2 "MyValue2";
:local a ({});
:set ($a->$key1) ({});
:set ($a->$key2) ({});
:set ($a->$key1->$key3) $val1;
:set ($a->$key2->$key4) $val2;

:log info $a;
:log info [:len $a];
Его выхлоп:

Код: Выделить всё

 D04DEA1091709160632421214=;;;MyValue1;D04DEA34224EB3D99170915112732146=;;;;MyValue2 
 2
Как видно из примера создаётся две строки, в первой вписывается значение в третий столбец, во второй вписывается значение в четвёртый столбец.
ОК, переношу данную конструкцию в свой код, но работать это перестаёт так как надо.
Весь код показывать не буду из-за размера, но постараюсь донести проблему:

Код: Выделить всё

:global struct;
:local ss ({});

for it from=0 to=([:len $struct] - 1) do={
	:if ($struct->$it->"udhi") do={
	:local concatenatedName (($struct->$it->"oaLine").($struct->$it->"sctsLine").($struct->$it->"udhOctet1"));
	:local concatenatedNum ($struct->$it->"udhOctet3");
	:log info $concatenatedName;
	:log info $concatenatedNum;
	:if ([:typeof ($ss->$concatenatedName)] = "nothing") do={:set ($ss->$concatenatedName) ({});};
	:set ($ss->$concatenatedName->$concatenatedNum) $concatenatedNum;
}}
:local l [:len $ss];
:local t [:typeof $ss];
:log info "len ss: $l";
:log info "type ss: $t";
:log info $ss;
:set ($ss->"D04DEA1091709160632421214"->7) "test";
:log info $ss;

Выхлоп:

Код: Выделить всё

 1 
D04DEA1091709160632421214 
4 
D04DEA34224EB3D99170915112732146 
2 
D04DEA1091709160632421214 
1 
D04DEA1091709160632421214 
3 
D04DEA1091709160632421214 
2 
D04DEA34224EB3D99170915112732146 
3 
len ss: 2 
type ss: array 
D04DEA1091709160632421214=;1;2;3;4;D04DEA34224EB3D99170915112732146=;1;2;3;4 
D04DEA1091709160632421214=;1;2;3;4;;;test;D04DEA34224EB3D99170915112732146=;1;2;3;4;;;test 
Соответственно видно, что оба ключа ссылаются на один и тот же адрес значения. Хотя первый пример работает так как надо. Где я ошибся?


pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

докумекал как создавать именованный массив, когда неизвестны имена и значения до запуска скрипта:

Код: Выделить всё

{
:local struct [:toarray ""]
:local n "name"
:local v "value"
:set $struct ($struct , [[:parse "({\"$n\"=\"$v\"})"]])
:put [:len $struct]
:put [:typeof $struct]
:put $struct
}


Ответить