Рубиновая петля выходит преждевременно - PullRequest
0 голосов
/ 29 ноября 2011
files = ["message_21.txt", "message_10.txt", "message_27.txt", "message_22.txt", "message_23.txt", "message_15.txt", "message_4.txt", "message_16.txt", "message_24.txt", "message_13.txt", "message_1.txt", "message_3.txt", "message_17.txt", "message_12.txt", "message_2.txt", "message_19.txt", "message_18.txt", "message_14.txt", "message_25.txt", "message_9.txt", "message_8.txt", "message_5.txt", "message_26.txt", "message_11.txt", "message_7.txt", "message_20.txt", "message_6.txt", "message_28.txt"]

files.each do |f|
file = File.new(PATH + "/" + f, "r")
        while (line = file.gets)
         @found=true if line =~ /You purchased/
         next unless @found
         puts line
         exit if line =~ /Order for/
    end
    file.close
end

Если message_4.txt содержит термин «Вы приобрели» и «заказ», термин полностью выходит из цикла.Поэтому я не могу получить другие файлы, которые содержат эти термины.Я не знаю, какую ошибку я совершил.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Вы пытаетесь выйти из цикла while, когда достигнете «Order for»?Потому что «выход» не то, что вы ищете.Попробуй взломать.Также вам нужно будет сбросить переменную @found для каждого файла.

files = ["message_21.txt", "message_10.txt", "message_27.txt", "message_22.txt", "message_23.txt", "message_15.txt", "message_4.txt", "message_16.txt", "message_24.txt", "message_13.txt", "message_1.txt", "message_3.txt", "message_17.txt", "message_12.txt", "message_2.txt", "message_19.txt", "message_18.txt", "message_14.txt", "message_25.txt", "message_9.txt", "message_8.txt", "message_5.txt", "message_26.txt", "message_11.txt", "message_7.txt", "message_20.txt", "message_6.txt", "message_28.txt"]

files.each do |f|
  @found = false
  file = File.new(PATH + "/" + f, "r")
  while (line = file.gets)
    @found=true if line =~ /You purchased/
    # below skips to start of next run of while loop
    next unless @found 
    puts line
    # below breaks out of while loop
    break if line =~ /Order for/ 
  end
  file.close
end

Посмотрите на это http://www.tutorialspoint.com/ruby/ruby_loops.htm - особенно объяснения 'next' и 'break'.

0 голосов
/ 29 ноября 2011

exit выходит из всей программы, а не только из цикла.Вам нужно break, а не exit, чтобы остановить цикл.

Вы также можете воспользоваться File.open принятием блока, который закроет файл для вас, когда блок вернется.

Также нет необходимости в @found, если только вы не намеренно сохраняете, что строка You purchased была найдена хотя бы один раз хотя бы в одном файле.

Наконец, вы должны исправить свой отступ наиспользуйте два пробела на уровне, как это принято в сообществе Ruby.

files = [...]

files.each do |f|
  File.open(PATH + "/" + f, "r") do |file|
    while line = file.gets
      next unless line =~ /You purchased/
      puts line
      break if line =~ /Order for/
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...