puppet基于密钥将数组转换为哈希
我有一个数组,如下所示:puppet基于密钥将数组转换为哈希,puppet,Puppet,我有一个数组,如下所示: $servers = [ {name => 'server1', address => '10.10.10.11', port => 8081}, {name => 'server2', address => '10.10.10.12', port => 8082}, ] 我需要以编程方式将其转换为基于“name”键的哈希: $serversMap = { server1 => {a
$servers = [
{name => 'server1', address => '10.10.10.11', port => 8081},
{name => 'server2', address => '10.10.10.12', port => 8082},
]
我需要以编程方式将其转换为基于“name”键的哈希:
$serversMap = {
server1 => {address => '10.10.10.11', port => 8081},
server2 => {address => '10.10.10.12', port => 8082},
}
这在puppet 3中起作用:
$serversMap = $servers.reduce({}) |$cumulate, $server| {
$key = "${server['name']}"
$value = $server.filter |$entry| { $entry[0] != 'name' }
$tmp = merge($cumulate, {"$key" => $value })
$tmp
}
然而,有没有更简单的方法
为什么我需要创建时间变量$tmp?
如果没有这一点,我将得到错误:函数“merge”必须是语句的值错误
ps:这很明显,但我还是要说:$servers变量是给我的,我不能改变它的结构。我需要相同的数据,但格式是$serversMap。因此,我要问的是如何以编程方式将$servers转换为$serversMap。除了$tmp变量之外,这段代码是最佳的
$tmp变量需要存在,因为merge函数是一个rvalue
。从:
实际上有两种完全不同的函数可用——右值(返回值)和语句(不返回值)。如果正在编写右值函数,则在创建函数时必须传递:type=>:rvalue;请参见下面的示例
当涉及到右值语句时,产生此错误的puppet源非常容易解释:
# It is harmless to produce an ignored rvalue, the alternative is to mark functions
# as appropriate for both rvalue and statements
# Keeping the old behavior when a pblock is not present. This since it is not known
# if the lambda contains a statement or not (at least not without a costly search).
# The purpose of the check is to protect a user for producing a meaningless rvalue where the
# operation has no side effects.
#
if !pblock && Puppet::Parser::Functions.rvalue?(@name)
raise Puppet::ParseError,
"Function '#{@name}' must be the value of a statement"
end
真正的原因是木偶并不像语言那么复杂。如果您想要真正的电源,请切换到Ruby。谢谢。我实现了这个puppet ruby函数: