Ruby «получает», который работает с несколькими строками

Используя IRB, я хочу ввести многострочную строку, чтобы удалить из нее определенные символы. «gets» разрешает только одну строку — есть ли аналогичная функция для нескольких строк.

ASCII_project.rb(main):002:0* puts = "What's the text you want to strip?"
=> "What's the text you want to strip?"
ASCII_project.rb(main):003:0> str = gets

Теперь я хочу вставить часть текста - из-за новых строк он не работает. Вот почему я хочу собрать несколько строк

Вот код

# encoding: CP850
puts = "What's the text you want to strip?"
str = gets
str.gsub!(/\P{ASCII}/, '')
puts str

person Joseph    schedule 12.12.2012    source источник
comment
хм, просто вызов получает несколько раз?   -  person SirDarius    schedule 12.12.2012
comment
Если не символом новой строки, как метод должен знать, когда прекратить чтение?   -  person Michał Kwiatkowski    schedule 12.12.2012


Ответы (4)


Вы можете сделать это следующим образом,

$/ = "END"  
user_input = STDIN.gets
puts user_input

не забудьте ввести ключевое слово END, когда вы думаете, что ввод завершен,

Кроме того, это будет работать только с реальным интерпретатором, а не с irb.

person maximus ツ    schedule 12.12.2012
comment
Это единственное жизнеспособное решение в Ruby. - person New Alexandria; 12.12.2012
comment
Можете ли вы объяснить, что делает $/? - person Joseph; 12.12.2012
comment
@Joseph, это глобальная переменная ruby ​​​​и используется в качестве разделителя для get и readline. - person maximus ツ; 12.12.2012

Вы можете использовать этот метод, он принимает текст до первой пустой строки

def multi_gets all_text=""
  while (text = gets) != "\n"
    all_text << text
  end
  all_text
end

или этот, вы можете заменить \n\n любым конечным символом, который вы определяете

def multi_gets all_text=""
  while all_text << STDIN.gets
    return all_text if all_text["\n\n"]
  end
end
person peter    schedule 12.12.2012
comment
Это хорошая инкапсуляция процесса завершающего символа. - person New Alexandria; 12.12.2012

Вы можете использовать readlines() на $stdin вот так

> $stdin.readlines
Mit Wohnungen, mit Bergen, Hügeln, Flüssen,
Solang ichs deutlich sah, ein Schatz der Freuden;
Zuletzt im Blauen blieb ein Augenweiden
An fernentwichnen lichten Finsternissen.

# ^D
 => ["Mit Wohnungen, mit Bergen, Hügeln, Flüssen,\n",
 "Solang ichs deutlich sah, ein Schatz der Freuden;\n",
 "Zuletzt im Blauen blieb ein Augenweiden\n",
 "An fernentwichnen lichten Finsternissen.\n"]
person Konrad Reiche    schedule 30.09.2013
comment
В вашем примере кода используется неправильное имя переменной для стандарта. Я бы отредактировал его, но его длина не превышает 6 символов. - person Will; 06.12.2013
comment
@Will Спасибо, это осталось незамеченным. - person Konrad Reiche; 06.12.2013

str = <<-EOF
Your multi line
text goes here
.....
EOF

Но загвоздка в том, что вам придется закончить с EOF

person Manish    schedule 12.12.2012