2014-04-29 5 views
0

2 개의 해시 값을 병합하려고합니다. 새 값을 만듭니다. 나는루비는 nil 값으로 해시를 병합합니다.

Hash[b.map{|k,v| [a[k],v]} 

으로 시도했지만 그것이 "A"값이 비어있는 것을 발견하면 (전무)은 그런 [K] ... 내가있어 뭔가 b를 인쇄하지 않습니다

| A | A |  | B | B | ====> | C | C | 
| key|value|  | key|value| ====> |B_value|A_value| 
| key|value|  | key|value| ====> |B_value|A_value| 
| key| nil |  | key|value| ====>  MISSING 
| key|value|  | key|value| ====> |B_value|A_value| 

키가 동일합니다 나는 또한 아무 것도 볼 필요가 없습니다. 내가 배열 형식으로 인쇄하려고하면

나는 모든 (무기 ​​호 포함) 볼 수 있습니다

p = a.map{|k,v| [b[k],v]} 

은 아마지도

이 올바른 해결책이 아니다, 나에게 동일한 결과를 줄 수있는 다른 뭔가가있다? 해시에서

header_hostname = Hash.new 
working_host = Hash.new 
fileset.each do |file| 
header = YAML.load_file("output/#{file}") 
header.each do |k_header,v_header| 
    if v_header == "Hostname" 
     header_hostname = header 
    end 
end 
working_host = Hash[header.map{|k, v| [header_hostname[k], v] }] 
puts working_host 
File.open("tmp/working_hosts.txt","a+") << working_host 

출력이 같다 :

이 내 코드입니다

...

Erogazione VlanID: '2390' 
" SubnetorIP": 10.*.*.* 
" Netmask": 255.255.255.240 
" Gateway": 10.*.*.* 

...

Backup VlanID: '' 
Managment VlanID: '' 
Privata HB VlanID: '' 
Remote Console VlanID: '' 

...

해시

Header = {"98"=>"Erogazione VlanID", "99"=>" SubnetorIP", "100"=>" Netmask", "101"=>" Gateway", "102"=>" Speed(f,g)", "103"=>" Bond(s/n)", "104"=>" Porte", "105"=>" Switch", "106"=>" Slot/Porte", "107"=>" PortePPanel", "108"=>" PortePPanel(bond)", "109"=>"Backup VlanID", "110"=>" SubnetorIP", "111"=>" Netmask", "112"=>" Gateway", "113"=>" Speed(f,g)", "114"=>" Porte", "115"=>" Switch", "116"=>" Slot/Porte", "117"=>" PortePPanel", "135"=>"Remote Console VlanID", "136"=>" SubnetorIP", "137"=>" Netmask", "138"=>" Gateway", "139"=>" Speed(f,g)", "140"=>" Porte", "141"=>" Switch", "142"=>" Slot/Porte", "143"=>" PortePPanel"} 

Machine1 = {"98"=>"3315", "99"=>"10.*.*.*", "100"=>"255.255.255.240", "101"=>"10.*.*.*", "102"=>"g", "103"=>"", "104"=>"2.0", "105"=>"", "106"=>"", "107"=>"", "108"=>"", "109"=>"111", "110"=>"10.*.*.*", "111"=>"255.255.255.240", "112"=>"10.*.*.*", "113"=>"g", "114"=>"1.0", "115"=>"", "116"=>"", "117"=>"", "135"=>"111", "136"=>"10.*.*.*", "137"=>"255.255.255.240", "138"=>"10.*.*.*", "139"=>"", "140"=>"", "141"=>"", "142"=>"", "143"=>"" } 

이 출력은 다음과 같습니다

output = {"Erogazione VlanID"=>"3315", " SubnetorIP"=>"10.*.*.*", " Netmask"=>"255.255.255.240", " Gateway"=>"10.*.*.*", " Speed(f,g)"=>"", " Bond(s/n)"=>"", " Porte"=>"", " Switch"=>"", " Slot/Porte"=>"", " PortePPanel"=>"", " PortePPanel(bond)"=>"", "Backup VlanID"=>"111", "Remote Console VlanID"=>"111"} 
+2

실제 출력물을 표시하고 어떻게 인쇄합니까? –

+1

['Hash # merge'] (http://www.ruby-doc.org/core-2.1.0/Hash.html#method-merge) 메소드에 대해 알고 계십니까? –

+0

병합 메서드는 old_value를 new_value와 병합합니다. 나는 이것을 필요로하지 않는다. B_value를 A_value의 키로 지정해야합니다. –

답변

0

귀하의 접근 방식은 잘 작동하는 것 같다, 그 결과 해시에서 "실종"항목을 생산하지 않습니다.

a = { a: 1, b: 2, c: nil, d: 4 } 
b = { a: 5, b: 6, c: 7, d: 8 } 

c = Hash[a.map{|k,v| [b[k],v]}] 
# {5=>1, 6=>2, 7=>nil, 8=>4} 

nila[:c] 값 없음 문제. b[:c]7이므로 7 => nil 매핑이 생성됩니다.

+0

맞아요, 잘 작동합니다. 하지만 내가 게시 한 해시로 뭔가 잃어버린 .. 나는 내 잘못이라고 확신하지만 내 코드가 잘못된 것을 볼 수 없다. –

+0

두 번째 해시 ('Machine1')의 많은 값이 복제된다. ''10. *. *. * "''및''"'. 결과 해시에서 * 키 *로 사용하고 해시에는 고유 키가 있으므로 마지막 매핑 만 해시에 저장됩니다. 어쨌든 다른 출력물을 얻습니다.'a = Header','b = Machine1'을 사용하고'Hash [a.map {| k, v | [b [k], v]}]'? '{ "3315"=> "Erogazione VlanID", "10. *. *. *"=> "Gateway", "255.255.255.240"=> "Netmask"' –

+0

I로 시작하는 해시를 얻을 것입니다. IP를 생략했습니다. 그들은 다릅니다. 어쨌든 내 잘못은 a = Machine1이고 b = Header (더 나은 : a = Header, b = Machine1 및 Hash [b.map {| k, v | [a [k], v]}]) –