2014-08-28 58 views
0

這段代碼應該循環遍歷IP地址數組,並檢查端口是否打開。Ruby Array打印爲字符串

class Ranger 

def initialize(port,file) 
    @port = port 
    @file = file 
    @arr = [] 
end 


def regex(f) 
    reg = IO.read(f) 
    reg.scan /(?:\d{1,3}\.){3}\d{1,3}/ 
end 


def fileread 
     if File.exists?(@file) 
      @arr << regex(@file).to_s 

      begin 
       @arr.each do |ip| 
        sock = Socket.new(:INET, :STREAM) 
        sockaddr = Socket.sockaddr_in(@port, ip.to_i) 

        puts "Host: #{ip}:#{@port} Open" if sock.connect(sockaddr) 

        next 

       end 

      rescue Errno::ECONNREFUSED 
       false 
      end 
     end 
end 

的代碼看起來幾乎完全工作,除了一兩件事。它打印出成功文本,即「主機:#{ip}:#{@ port}打開」。問題在於它打印出#{ip}所在的整個數組,如下所示:[「xx.xx.xx.xx」,「xx.xx.xx.xx」,「xx.xx.xx.xx」 ]:22打開。

這似乎與腳本中的.to_s和.to_i有關,但如果沒有這些腳本,它將無法工作。

+0

您希望輸出什麼? 'ip'是一個數組,而'@arr'是一個陣列數組。編輯:其實,'@ arr'是數組的字符串表示的數組 – 2014-08-28 23:11:15

+0

嘗試'@arr.flatten.each do | ip |'來代替。 'scan'總是返回一個數組,所以'@ arr'是一個數組數組。 – BroiSatse 2014-08-28 23:11:17

回答

0

從我所看到的你只添加一件事的@arr變量...

@arr << regex(@file).to_s 

正則表達式()調用string.scan()返回一個數組(大概是你的IP地址3

你那麼數組轉換爲字符串,並追加到@arr的字符串。

無論你想

@arr = regex(@file) # replace 

@arr += regex(@file) # concatenate 
+0

這是完美的謝謝你。 + =運算符,以及刪除.to_s和.to_i修復了這個問題。 – user3408678 2014-08-29 00:01:02