如何合并IP地址并忽略错误的IP地址Ruby

时间:2017-04-26 17:12:17

标签: arrays ruby merge ip

我有一个包含子网的数组数组,其中一个子网是错误的(缺少一个八位字节),我想合并它们并忽略错误的数据。

我有以下代码:

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 不会出现在输出中。

2 个答案:

答案 0 :(得分: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"]]

答案 1 :(得分:1)

由于您致电159.226.92.0/24

NetAddr#merge未出现在输出中。

NetAddr#merge获取您的数组(在本例中为["159.226.92.0/24","159.8.57/22"]),解析数组中的每个地址,并合并解析后的地址。在伪Ruby中,就是这样:

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调用失败,并且您没有得到任何结果。