Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
puppet基于密钥将数组转换为哈希_Puppet - Fatal编程技术网

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函数: