2017-04-26 67 views
0

我有一個由三個Ruby對象組成的數組,每個對象表示一個實體,每個實體都有一個內部AS編號,公有和私有IP地址範圍。 數組是這樣的:如何將Ruby對象中的項目寫入文件

entities = [#<Entity:0x0000000288a570 @name="entity-A",@internal_asn_number=64513, @public_range=["240.28.56.0-240.28.56.255", "250.154.64.0-250.154.64.255", "251.154.65.0-251.154.65.255"], @private_range=["16.1.1.1-16.1.1.254"]>,  #<Entity:0x000000028839a0 @name="entity-B", @internal_asn_number=64514, @public_range=["195.65.46.0-195.65.46.255","196.2.84.0-196.2.84.255","197.13.105.0-197.13.105.255"], @private_range=["11.2.1.1-11.2.1.254"]>,  #<Entity:0x0000000287b0c0 @name="entity-C", @internal_asn_number=64512, @public_range=["102.206.119.0-102.206.119.255", "103.206.12.0-103.206.12.255", "104.28.90.0-104.28.90.255"], @private_range=["2.1.1.1-2.1.1.254"]>] 

我保存的IP範圍成一個獨特的可變,所以後來我可以改變的範圍爲CIDR格式和合並。然後我將最終結果保存到一個數組中。最後,我嘗試寫的輸出入格式的文件(合併後的IP地址/ AS號碼):

240.28.56.0/24 64513 
250.154.64.0/24 64513 
251.154.65.0/24 64513 
16.1.1.1/32 64513 

而且我有以下代碼:

require 'netaddr' 

cidrs = Array.new 

File.open('out.dat', "w") do |f| 
    entities.each do |entity| 
     asn = entity.internal_asn_number 
     ranges = entity.public_range + entity.private_range 
     ranges.each do |ip_range| 
     new_range = ip_range.split(/\s*-\s*/) 
     startip = new_range[0] 
     endip = new_range[1] 
     ip_net_range = NetAddr.range(startip, endip, :Inclusive => true, :Objectify => true) 
     cidrs << NetAddr.merge(ip_net_range) 
     end 
     new_cidrs = cidrs.flatten 
     new_cidrs.each do |ip| 
     f.write("#{ip}\t #{asn}\n") 
     end 
    end 
end 

此代碼給我下面的輸出:

240.28.56.0/24 64513 
250.154.64.0/24 64513 
251.154.65.0/24 64513 
16.1.1.1/32 64513 
16.1.1.2/31 64513 
16.1.1.4/30 64513 
16.1.1.8/29 64513 
16.1.1.16/28  64513 
16.1.1.32/27  64513 
16.1.1.64/26  64513 
16.1.1.128/26 64513 
16.1.1.192/27 64513 
16.1.1.224/28 64513 
16.1.1.240/29 64513 
16.1.1.248/30 64513 
16.1.1.252/31 64513 
16.1.1.254/32 64513 
240.28.56.0/24 64514 
250.154.64.0/24 64514 
251.154.65.0/24 64514 
16.1.1.1/32 64514 
16.1.1.2/31 64514 
16.1.1.4/30 64514 
16.1.1.8/29 64514 
16.1.1.16/28  64514 
16.1.1.32/27  64514 
16.1.1.64/26  64514 
16.1.1.128/26 64514 
16.1.1.192/27 64514 
16.1.1.224/28 64514 
16.1.1.240/29 64514 
16.1.1.248/30 64514 
16.1.1.252/31 64514 
16.1.1.254/32 64514 
195.65.46.0/24 64514 
196.2.84.0/24 64514 
197.13.105.0/24 64514 
11.2.1.1/32 64514 
11.2.1.2/31 64514 
11.2.1.4/30 64514 
11.2.1.8/29 64514 
11.2.1.16/28  64514 
11.2.1.32/27  64514 
11.2.1.64/26  64514 
11.2.1.128/26 64514 
11.2.1.192/27 64514 
11.2.1.224/28 64514 
11.2.1.240/29 64514 
11.2.1.248/30 64514 
11.2.1.252/31 64514 
11.2.1.254/32 64514 
240.28.56.0/24 64512 
250.154.64.0/24 64512 
251.154.65.0/24 64512 
16.1.1.1/32 64512 
16.1.1.2/31 64512 
16.1.1.4/30 64512 
16.1.1.8/29 64512 
16.1.1.16/28  64512 
16.1.1.32/27  64512 
16.1.1.64/26  64512 
16.1.1.128/26 64512 
16.1.1.192/27 64512 
16.1.1.224/28 64512 
16.1.1.240/29 64512 
16.1.1.248/30 64512 
16.1.1.252/31 64512 
[...] 

基本上,IP地址被寫入文件三次,我所期待的是有來自實體-A合併後的IP地址與實體-A的AS號等。

我不知道我在做什麼錯。

+0

當我們展示了輸入數據的陣列,請不要使用'inspect'輸出,而不是提供代碼生成數組。要求我們重新生成代碼來創建'#

+0

謝謝@theTinMan我不知道這一點,我試圖變得簡單,但相反,我變得更加複雜!下次我會更加小心! – mf370

+0

如果你現在要修復它,這真的很有幫助。請記住,Stack Overflow不是一個討論列表,它更像是一本在線參考書,而你的問題是一篇新文章。因此,使文章有意義是很重要的。好問問題收集選票。 –

回答

1

您得到重複條目的原因是cidrs數組是在循環遍歷每個實體之前聲明的,因此第二個實體具有所有第一個實體以及它自己的所有實體等等。

如果移動cidrs數組聲明到entity循環似乎工作:

File.open('out.dat', "w") do |f| 
    entities.each do |entity| 
     cidrs = Array.new 
+0

謝謝@ c3st7n!這種愚蠢的錯誤! – mf370