我在hieradata中有此数据结构
server:
host: 'foo.bar.baz'
public_host:
common:
host: 'foo.bar.baz'
internal:
host: 'some.internal.name'
partition:
name: 'int'
service_port:
8443:
nonvs:
partition:
name: 'BLA'
manage_virtualserver: false
现在,我需要一种在$ server ['public_host']中选择具有给定键值对的完整嵌套哈希的方法。
例如我正在寻找... ['partition'] ['name'] ='BLA',将获得$ server ['public_host'] ['nonvs']
希望很清楚我想做什么。
答案 0 :(得分:2)
您可以使用filter
解决此问题:
$server = lookup('server')
$public_host = $server['public_host']
$filtered_data = $public_host.filter |$k, $v| {
has_key($v, 'partition') and has_key($v['partition'], 'name')
and $v['partition']['name'] == 'BLA'
}
您还需要stdlib来获得has_key()
函数。
如果您希望生成的哈希值包含嵌套在partition
键级别的哈希值(如注释所示),则可能会尝试在数据上使用reduce
:
$reduced_data = $filtered_data.reduce({}) |$memo, $x| {
$memo + $x[1]
}
$x
是$ filtered_data中每个顶级键的[key,value]对,因此$x[1]
返回顶级哈希值中的哈希值。
例如,如果$ filtered_data为{a => {d => 1}, b => {e => 2}, c => {f => 3}}
,则$ reduced_data将为{d => 1, e => 2, f => 3}
。
但是,这将无济于事,因为您最终会在生成的哈希表的顶层使用多个partition
键。由于散列不可能包含重复的键,因此除一个分区外,所有分区都将被静默丢弃。