#ruby
#ruby
Вопрос:
Я использовал:
open("some.txt") { |f| f.each_line.detect { |line| /re/.match(line) } }
Это показывает мне только первый раз, когда эта строка появляется в этом файле. Как мне распечатать ВСЕ строки, содержащие эту строку.
Комментарии:
1.
File.readlines("some.txt").select { |line| /re/.match(line) }
Ответ №1:
Ответ №2:
Добавление ответа @Some Guy.
У вас также есть #select, который, я думаю, используется чаще.
Бонус: вы можете использовать метод #[] вместо a regex#match
. Это должно быть немного быстрее, и в вашем случае работает отлично.
open("some.txt") { |f| f.each_line.select { |line| line['re'] } }
Комментарии:
1. select — это псевдоним для find_all
2. @SomeGuy я вижу это чаще. В любом случае, это всего лишь мое мнение.
3. Достаточно справедливо. Я нахожу интересным, что detect и find_all являются оригиналами, а также находят и выбирают псевдоним для них. ИМХО было бы разумнее, если бы detect / select или find / find_all были сопряжены. Случайная мысль.
4.В
Eunumerable
select
иfind_all
одинаковы: github.com/ruby/ruby/blob/trunk/enum.c#L3240-L3241 , ноArray#select
отличается: github.com/ruby/ruby/blob/v2_1_2/array.c#L5658 .Array#find_all
возвращается кEnumerable
версии. Так что, возможно,select
это быстрее при работе с массивами. В этом случае похоже, что они одинаковы.
Ответ №3:
Вы можете получить искомое поведение с помощью чего-то вроде этого:
File.open("some.txt") do |f|
f.each do |line|
puts line if line =~ /re/
end
end
Если вам действительно нужен массив, каждая строка которого соответствует регулярному выражению, #find_all
это правильный путь:
File.open("some.txt") do |f|
lines = f.find_all {|line| line =~ /re/ }
end