Если строки являются просто строками, вы можете объединить их в одно регулярное выражение, например:
targets = [
"string1",
"string2",
].collect do |s|
Regexp.escape(s)
end.join('|')
targets = Regexp.new(targets)
А потом:
lines = File.readlines('/tmp/bar').reject do |line|
line !~ target
end
s !~ regexp
эквивалентно not s =~ regexp
, но легче для чтения.
Избегайте использования File.open без закрытия файла. Файл будет оставаться открытым до тех пор, пока удаленный файловый объект не будет собран сборщиком мусора, что может быть достаточно долго, чтобы в вашей программе не было файловых дескрипторов. Если вам нужно больше, чем просто читать строки, то:
File.open(path) do |file|
# do stuff with file
end
Ruby закроет файл в конце блока.
Вы также можете подумать, будет ли проще использовать find_all и положительное совпадение, чем отклонение и отрицательное совпадение. Чем меньше негативов должен пройти читатель, тем яснее код:
lines = File.readlines('/tmp/bar').find_all do |line|
line =~ target
end