簡體   English   中英

Puppet:合並具有相同鍵的哈希

[英]Puppet: Merge a Hash with same keys

我有一個數組

$servers = [192.168.1.1, 192.168.1.2]

應該將其轉換為具有以下形式的哈希值的數組(具有哈希值的數組,並作為鍵“主機名”和數組服務器的實際值):

[
    { hostname => 192.168.1.1 }
    { hostname => 192.168.1.2 }
]

我嘗試了以下方法:

$servers_hash = $servers.reduce({}) |$servermerge, $serverip| {
  $servermerge + { 'hostname' => $serverip }
}

問題是,如果兩個具有相同鍵的哈希與+合並,第一個會被覆蓋。 所以只剩下{ hostname => 192.168.1.2 }了。

更新:以及以下內容:

$servers_array = $servers.reduce([]) |$servermerge, $serverip| {
  $servermerge + { 'hostname' => $serverip }
}

其中給出: [[hostname, 192.168.1.1], [hostname, 192.168.1.2]]

由於您想要與輸入中的條目一樣多的結果,最簡單(也是最好)的方法是使用map()函數:

$servers_array = $servers.map |$ip| { { 'hostname' => $ip } }

雖然產生新值的迭代的一般形式是reduce()但它稍微復雜一些,因為您必須構造結果數組。 在 puppet 中執行此操作時,每個附加<<運算符都會創建數組的新副本。 如果輸入數組很長,這可能會成為一個很大的開銷。 因此,在可能的情況下,更專業的map()filter()等迭代函數應該比reduce()更受歡迎,因為這些函數在構建結果時保持臨時可變狀態。

解決方案:

如果使用+ ,則代碼的右側將轉換為數組,與之前相同。 使用<<這個轉換沒有完成。

$servers_array = $servers.reduce([]) |$servermerge, $serverip| {
  $servermerge << { 'hostname' => $serverip }
}

其中給出: [{hostname, 192.168.1.1}, {hostname, 192.168.1.2}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM