我有一个包含子网的数组数组,其中一个子网是错误的(缺少一个八位字节),我想合并它们并忽略错误的数据。
我有以下代码:
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 不会出现在输出中。
答案 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
调用失败,并且您没有得到任何结果。