2014-08-28 3 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 

конец

код, кажется, почти полностью работает, за исключением одной вещи. Он печатает текст успеха i.e «Host: # {ip}: # {@ port} Open». Проблема заключается в том, что он печатает весь массив, где # {ip}, например: ["xx.xx.xx.xx", "xx.xx.xx.xx", "xx.xx.xx.xx" ]: 22 Открыть.

Кажется, что-то связано с .to_s и .to_i в скрипте, но это не будет работать без них.

+0

Какой выходной сигнал вы ожидаете? 'ip' - это массив, а' @ arr' - массив массивов. EDIT: На самом деле '@ arr' является массивом строковых представлений массивов. –

+0

Вместо этого попробуйте' @arr.flatten.each do | ip | '. 'scan' всегда возвращает массив, поэтому' @ arr' представляет собой массив массивов. – BroiSatse

ответ

0

Из того, что я могу видеть, вы только добавление одного к @arr переменного ...

@arr << regex(@file).to_s 

регулярного выражения() вызывает string.scan(), который возвращает массив (предположительно 3 ваших IP-адресов

вы затем преобразовать массив в строку и добавляя строку @arr.

или вы хотите

@arr = regex(@file) # replace 

или

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

Это прекрасное спасибо. Оператор + =, а также удаление .to_s и .to_i исправили проблему. – user3408678