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を使用できます:succnext

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

これを試してください。正規表現の代わりにsplit/joinを使用します。

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 に答える