2017-04-26 49 views
-1

我有一個數組包含子網,其中一個子網錯誤(缺少一個八位字節),我想合併它們並忽略錯誤的。如何合併IP地址並忽略錯誤的IP地址Ruby

我有以下代碼:

subnets = ["149.62.168.0/24"], ["134.247.2.0/24"], ["159.226.92.0/24","159.8.57/22"] 

require 'netaddr' 

subnet.each do |net| 
    begin 
    merged_subnets = NetAddr.merge(net) 
    rescue ArgumentError => error 
    puts error 
    end 
    puts merged_subnets 
end 

此代碼給我下面的輸出:

149.62.168.0/24 
134.247.2.0/24 
One of the provided CIDR addresses raised the following errors: 159.8.57 is invalid (IPv4 requires (4) octets). 

然而,我所期待的是:

149.62.168.0/24 
134.247.2.0/24 
159.226.92.0/24 
One of the provided CIDR addresses raised the following errors: 159.8.57 is invalid (IPv4 requires (4) octets). 

我不不明白爲什麼子網159.226.92.0/24沒有出現在t他輸出。

+0

技術上說,應該是'subnets = [[「149 ...」],[...],...],其中有周圍的方括號。你在那裏工作,但它是誤導。你實際創建數組的數組。 'flatten'可以幫助遍歷所有的單個元素。 – tadman

回答

1

您的代碼有多個錯誤。

  • 您在初始化subnets陣列時出現不一致。最後一個值在同一個子數組中有兩個子網:["159.226.92.0/24","159.8.57/22"]是導致您看到的錯誤的數組,因此它將兩個值都丟掉,這就是爲什麼在最終結果中看不到159.226.92.0/24的原因。
  • 您在迭代subnet這是一個錯字,我相信您的意思是subnets
  • 您在每次迭代時覆蓋merged_subnets

我固定的代碼:

subnets = ["149.62.168.0/24"], ["134.247.2.0/24"], ["159.226.92.0/24"], ["159.8.57/22"] 

require 'netaddr' 

merged_subnets = [] 

subnets.each do |net| 
    begin 
    merged_subnets << NetAddr.merge(net) 
    rescue ArgumentError => error 
    puts error 
    end 
end 

merged_subnets現在[["149.62.168.0/24"], ["134.247.2.0/24"], ["159.226.92.0/24"]]

+0

謝謝@DiegoSalazar,是的'子網'是一個錯字。我從YAML文件中獲取子網,一些YAML擁有多個子網,這就是爲什麼最後一個數組有兩個子網,而不是一個子網,就像其他兩個子網一樣。但我會嘗試將它們分開,以達到所需的輸出!謝謝! – mf370

1

159.226.92.0/24不會出現在輸出中,因爲您的來電NetAddr#merge的。

NetAddr#merge需要你的數組(在這種情況下,["159.226.92.0/24","159.8.57/22"]),解析數組中的每個地址,併合並解析的地址。在僞紅寶石,那會是這樣的:

def merge(ary) 
    parsed = [] 
    for addr in ary do 
     parsed << parse(addr) 
    end 

    merge_parsed(parsed) 
end 

正如你可以看到,如果調用parse(addr)失敗,整個方法將失敗,並引發錯誤,返回任何結果。由於159.226.92.0/24位於無效地址159.8.57/22的子網陣列中,因此整個陣列上的merge調用失敗,並且您沒有得到任何結果。