2016-01-21 2 views
-1

Я пытаюсь проанализировать массив, который я создал, чтобы в конечном итоге записать «хорошие» значения в файл. Массив может выглядеть примерно так, однако содержимое может меняться, так что я не могу соответствовать для определенного значения:Оператор Ruby if, чтобы исключить несколько изменений строки

array = ["10.10.10.0/24", "10.10.10.1/32", "10.10.10.129/32", "127.0.0.0/8", "169.254.0.0/16", "192.168.1.0/24", "255.255.255.255/32"] 

Я считаю, что это имеет смысл проверить массив значений перед тем запись в файл и не пишите значения, которые я знаю, что я не хочу. В этом случае значение всегда будет:

10.10.10.1/32 
10.10.10.129/32 
127.0.0.0/8 
169.254.0.0/16 
255.255.255.255/32 

Моего первоначальное if заявление выглядело так, что рода сделал то, что я после, но не полностью:

if !network.include?("/32" || "127.0.0.0/8" || "169.254.0.0/16" || "255.255.255.255/32") 
    file.write("#{network}\n") 
end 

что приводит к (линии 2 & 3 не должны были включены):

10.10.10.0/24 
127.0.0.0/8 
169.254.0.0/16 
192.168.1.0/24 

Что я сделал сонате нг? Есть ли лучший способ выполнить поиск/сопоставление/исключение?

+0

Непонятно, что вы имеете в виду. – sawa

ответ

1
networks = ["10.10.10.0/24", "10.10.10.1/32", "10.10.10.129/32", "127.0.0.0/8", "169.254.0.0/16", "192.168.1.0/24", "255.255.255.255/32"] 
banned_networks = [/\/32/, "127.0.0.0/8", "169.254.0.0/16", "255.255.255.255/32"] 

networks.reject do |e| 
    case e 
    when *banned_networks 
    true 
    end 
end.each {|network| file.write("#{network}\n")} 
+0

Удивительный! Просто нужно было сделать небольшое редактирование в строке оператора when, чтобы заставить регулярное выражение работать. Благодаря! – Godzilla74

+0

@ Godzilla74 да. Это тоже показалось. Добавит немного лишних за несколько секунд. –

1

Вы не можете использовать "или" || вот так.

Лучше бы ...

exclude_entries = [ '/32', 
        '127.0.0.0/8', 
        '169.254.0.0/16', 
        '255.255.255.255/32' 
        ] 
match_pattern = Regex.new(exclude_entries.join('|')) 

(array.reject{|n| n =~ match_pattern}.each do |network| 
    file.write("#{network}\n") 
end 

Проблема заключается в том, что выражение "/32" || "127.0.0.0/8"всегда возвращается "/ 32" ... "или" просто возвращает первый "truthy" значение и «/ 32 "является" правдой "

Отредактировано для использования регулярного выражения, чтобы исключить частичный текст.

+0

Каким будет размещение определенных неизвестных в массиве exclude_entries? Например, '/ 32', который вы заметите, есть несколько адресов, которые заканчиваются на'/32'. – Godzilla74

+0

Привет, хорошо, отредактировано так, чтобы исключить записи могут включать в себя одно или несколько партикулов. – SteveTurczyn

+0

Ruby 2.3 реализует ['Enumerable # grep_v'] (http://ruby-doc.org/cor/Enumerable.html#method-i-grep_v), который можно использовать здесь вместо' # reject': 'array.grep_v (match_pattern) '. – cremno

Смежные вопросы