1 (изменено: chebu, 2019-01-27 19:22:04)

Тема: AHK: Ассоциативный массив из переменной

Приветствую! Прошу показать или подсказать, что я делаю не так, ибо свои идеи закончились. Пытаюсь получить ассоциативный массив из переменной.

Пример из мануала воспроизводится без проблем.

primer1 := {RED: 111, BLUE: 222, GREEN: 333}
MsgBox % primer1.blue

На выходе "111" и удобство обращения через ключ.



Пытаюсь создать пару аналогичных массивов из имеющейся строки при помощи RegExReplace и StrSplit.

primer2 = {"zazazaz","pen":{RED: 111, BLUE: 222, GREEN: 333},"marker":{BLACK: 44, YELLOW: 55, BLUE: 66},"pencil" ":zazazaz"}
primer2 := RegExReplace(primer2, ".*""pen"":\{(.*)}`,""marker"":\{(.*)}`,""pencil"".*", "{$1}`n{$2}")
arr := StrSplit(primer2, "`n")
MsgBox % arr[1] "`n" arr[2]

На выходе получаю arr[1] и arr[2], - синтаксис тот же, но значение по ключу не выгивается.

2

Re: AHK: Ассоциативный массив из переменной

Оформите название темы в соответствии с правилами.

Строка, представляющая объект:

{"zazazaz","pen":{RED: 111, BLUE: 222, GREEN: 333},"marker":{BLACK: 44, YELLOW: 55, BLUE: 66},"pencil" ":zazazaz"}

Неправильно сформирована её источником. Измените его логику так, чтобы каждому ключу было назначено значение, даже пустое("") и тогда не будет необходимости в дополнительных обработках для доступа к значениям такого объекта. Это больше упростит Вам задачу, нежели ненужная надстройка над строкой, семантика содержимого которой описывает объект.

3

Re: AHK: Ассоциативный массив из переменной

Используй JSON.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

4

Re: AHK: Ассоциативный массив из переменной

KusochekDobra пишет:

Оформите название темы в соответствии с правилами.

Строка, представляющая объект:

{"zazazaz","pen":{RED: 111, BLUE: 222, GREEN: 333},"marker":{BLACK: 44, YELLOW: 55, BLUE: 66},"pencil" ":zazazaz"}

Неправильно сформирована её источником. Измените его логику так, чтобы каждому ключу было назначено значение, даже пустое("") и тогда не будет необходимости в дополнительных обработках для доступа к значениям такого объекта. Это больше упростит Вам задачу, нежели ненужная надстройка над строкой, семантика содержимого которой описывает объект.

Я не могу изменить логику источника, значение переменной получаю "как есть": 2 группы "ключ:значение" + немного лишних букв. При помощи RegExReplace
привожу обе группы к виду "{RED: 111, BLUE: 222, GREEN: 333}", но вместо ассоциативных массивов получаю 2 обычных.

5

Re: AHK: Ассоциативный массив из переменной

Если возьмёте в кавычки названия ключей, можно использовать JSON, смотрите тему в коллекции.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Ассоциативный массив из переменной

У меня "Wrong Json!", если только взять в кавычки ключи. =/

chebu, нужная Вам библиотека тут.


#Include JSON.ahk

reg_ex = {"zazazaz",("pen":{.*},"marker":{.*}),"pencil" ":zazazaz"}
primer2 = {"zazazaz","pen":{RED: 111, BLUE: 222, GREEN: 333},"marker":{BLACK: 44, YELLOW: 55, BLUE: 66},"pencil" ":zazazaz"}
result := JSON.Parse(RegExReplace(primer2, reg_ex, "{$1}"))
MsgBox % result.pen.red "`n" result.marker.yellow

7

Re: AHK: Ассоциативный массив из переменной

KusochekDobra пишет:

У меня "Wrong Json!", если только взять в кавычки ключи. =/

Да, я имел в виду строку "{RED: 111, BLUE: 222, GREEN: 333}". Но оказалось, работает и без этого:

str := "{RED: 111, BLUE: 222, GREEN: 333}"
result := JSON.Parse(str)
MsgBox % result.red
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Ассоциативный массив из переменной

Огромное спасибо всем, JSON.ahk решил все проблемы.