如何从 TCL 写出嵌套密钥 YAML?

How to write out nested key YAML from TCL?

我正在寻找如下模板。我尝试了 dict2yaml,它没有给出如下的 YAML 格式。 有人可以帮忙吗?

LEVEL_1:
         LEVEL_2:
                 LEVEL_3: some_value

另一个变体是

LEVEL_1:
         LEVEL_2:
                 LEVEL_3:
                        - some_value1
                        - some_value2
                        - some_value3

这是一个很好的例子,说明 Tcl 的类型系统对您没有帮助。任何包含偶数项的列表都可以被视为字典。

例如:

set nested_dict {key1 {key2 {x y}}}

y具有三个嵌套键的字典的值还是{x y}具有两个嵌套键的字典的值?

yaml::dict2yaml 函数仅适用于没有嵌套键的简单字典。

一种可能是将您的嵌套字典转换为“huddle”https://wiki.tcl-lang.org/page/huddle,然后使用 yaml::huddle2yaml

迭代嵌套键并自己处理缩进可能更简单。这是假设您知道嵌套字典的结构。

set nested_dict {key1 {key2 {x y}}}

dict for {k1 d1} $nested_dict {
    puts "$k1:"
    dict for {k2 d2} $d1 {
        puts "    $k2:"
        dict for {k3 val} $d2 {
            puts "        $k3: $val"
        }
    }
}

打印出:

key1:
    key2:
        x: y

一个乱七八糟的例子:

package require huddle
package require yaml
      
set MyHuddle [huddle create]
huddle set MyHuddle LEVEL_1 [huddle create]
huddle set MyHuddle LEVEL_1 LEVEL_2 [huddle create] 
huddle set MyHuddle LEVEL_1 LEVEL_2 LEVEL_3 [huddle list some_value1 some_value2 some_value3]

yaml::huddle2yaml $MyHuddle

打印出:

---
LEVEL_1:
  LEVEL_2:
    LEVEL_3:
      - some_value1
      - some_value2
      - some_value3

请仔细阅读 huddle 手册页。 huddle createhuddle setdict createdict set 非常相似。但是,我发现我需要在 LEVEL_1 和 LEVEL2 下面明确创建一个 huddle,然后才能设置 LEVEL_3 键的值。