0

这是我的IP:192.168.2.0

我需要得到一个像这样的数组:

["192.168.2.0",
 "192.168.2.1",
 "192.168.2.2",
 "192.168.2.3",
 "192.168.2.4",
 "192.168.2.5"]

这是我如何将最后一位增加到5

ip = '192.168.2.0'

ips = 0.upto(5).map do |n|
  ip.sub(/\.\d+$/, '.' << n.to_s)
end

但是它很慢,我讨厌它的外观。

重要- 我需要初始ip保持不变,以便我以后可以通过ip变量引用它。

4

4 回答 4

4

标准库有IPAddr,它支持一种succ方法。

require 'ipaddr'
ip = "192.168.2.0"

ips = [ip]
5.times do 
  ips << IPAddr.new(ips.last).succ.to_s
end
p ips
# =>["192.168.2.0", "192.168.2.1", "192.168.2.2", "192.168.2.3", "192.168.2.4", "192.168.2.5"]

#Ranges work:
ip_range = IPAddr.new("192.168.2.0")..IPAddr.new("192.168.2.5")
p ip_range.map(&:to_s)
# =>["192.168.2.0", "192.168.2.1", "192.168.2.2", "192.168.2.3", "192.168.2.4", "192.168.2.5"]
于 2012-11-18T21:06:45.830 回答
1

只要您处理下的数字,9您就可以使用succ(或next):

ip = '192.168.2.0'

p (0...5).inject([ip]) { |l| l << l.last.succ }

#=> ["192.168.2.0", "192.168.2.1", "192.168.2.2", "192.168.2.3", "192.168.2.4", "192.168.2.5"]

如果您需要递增到255,请使用split比正则表达式快得多的方法:

p (0..255).inject([ip]) { |l, d| l << (l.last.split('.')[0..2] << d).join('.') }

#=> ["192.168.2.0" ... "192.168.2.255"]

在此处查看现场演示

于 2012-11-18T20:24:06.307 回答
1

试试这个,它使用拆分/加入而不是正则表达式。

ip = '192.168.2.0'

ips = 0.upto(5).map do |n|
  ip.split('.').tap{|i| i[-1] = n }.join('.')
end
于 2012-11-18T20:25:43.900 回答
1

我建议使用stdlib 中的IPAddr,因为它可以优雅地处理八位字节翻转(当您达到 .255 时),并且还具有一些用于子网划分等有用的功能。

require 'ipaddr'
current = ip = IPAddr.new('192.168.2.0')
array = [ip]
until current.to_s == '192.168.2.5'
  array << current = current.succ
end
array.map!(&:to_s)
于 2012-11-18T21:16:40.387 回答