如何将指定Puppet哈希转换为服务器对应端口数组的目标哈希?
解决方法
你遇到的问题是map方法返回的是包含单个键值对哈希的数组,而非你需要的统一哈希结构。可以通过两种方式修正:
方法1:用Hash()函数转换map结果
直接将map生成的数组传入Hash()函数,Puppet会自动将数组中的单键哈希合并为一个完整哈希:
$newHash = Hash($oldHash.map |$server, $ports| { {$server => keys($ports)} })
方法2:用reduce累积构建哈希
初始化一个空哈希,通过reduce迭代原哈希的每个键值对,逐步将新的键值对合并到结果中:
$newHash = $oldHash.reduce({}) |$memo, $server_ports| { $server = $server_ports[0] $ports = $server_ports[1] $memo + {$server => keys($ports)} }
原理说明
map方法的作用是遍历集合,为每个元素返回一个新值,你原代码中每次迭代返回{$server => keys($ports)}(一个单键哈希),最终得到的是包含这些单键哈希的数组。- 上述两种方法都是将数组中的多个单键哈希合并为一个全局哈希,符合你的目标结构。
内容的提问来源于stack exchange,提问作者David L
相关产品推荐
相关产品推荐

