问题描述
$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()
,但由于必须构造结果数组,所以它稍微复杂一些。在人偶中执行此操作时,每个带有<<
运算符的附加操作都会创建该数组的新副本。如果输入数组很长,那么这可能会成为很大的开销。出于这个原因,在可能的情况下,应优先选择更专业的map()
,filter()
等迭代函数,而不是reduce()
,因为这些函数在建立时会保持临时可变状态结果。
解决方案:
如果使用+
,则代码的右侧将强制转换为数组,从而针刺之前的状态。使用<<
时,此转换无法完成。
$servers_array = $servers.reduce([]) |$servermerge,$serverip| {
$servermerge << { 'hostname' => $serverip }
}
哪个给出:[{hostname,192.168.1.1},{hostname,192.168.1.2}]