2016-06-06 5 views
-1

자리 표시 자 NOUN, VERB, ADJADV을 파일에 사용자 입력이 필요합니다.파일을 문자열로 변환하고 문자열 텍스트를 사용자 입력으로 바꾸기

마들 리브의 solution09.txt : 내 아들 [ADV] 그의 [명사] 함께 플레이를보고 있었다

어느 날. 그는 [NOUN]이 [ADJ] 인 척했다. 몇 분 후에 그는 [NOUN] 중 하나가 몰 았기 때문에 [VERB]를 가장하고있었습니다. 내가 그것에 대해 물었을 때 [ADV]는 [NOUN] [VERB]이 [NOER]가 실제로 [VERB] 할 수 없기 때문에 재미 있었다고 말했다.

파일에 문자열을 넣었지만 문자열을 읽고 사용자 입력으로 자리 표시자를 바꿔야한다고 생각합니다. 교체가 끝나면 새로운 madlib을 출력해야합니다. 변수에 사용자 입력을 가져 오는 중이지만 자리 표시자를 사용자 입력으로 올바르게 바꾸는 방법을 모르겠습니다.

현재 코드 :

file = File.open("solution09.txt", "r") 
contents = file.read 
puts "Enter a noun: " 
noun = gets.chomp 

puts "Enter a verb: " 
verb = gets.chomp 

puts "Enter an adjective: " 
adj = gets.chomp 

puts "Enter an adverb: " 
adv = gets.chomp 

if file.include?('NOUN') 
    file1= file.gsub("[NOUN]", noun, "[VERB]", verb, "ADJ", adj, "ADV", adv) 
end 
+1

첫 번째 문제는 gsub이 그렇게 작동하지 않는다는 것입니다. 여러 개의 치환을 원한다면'new_string = old_string.gsub ([NOUN] ', 명사) .gsub ('[VERB] ', 동사)와 같이 gsub를 여러 번 호출해야합니다' 당신이 원하는대로 많은 덩어리. 두 번째 문제는 품사를 둘러싼 []와 모순된다는 것입니다. 명사와 동사는 ADJ와 ADV가 가지고 있지 않습니다. 세 번째 문제는 파일을 가리키는 문자열 인'contents'보다는 파일 객체 인'file'에서 gsub를 호출한다는 것입니다. 그것은 시작하기에 충분해야합니다. –

+0

정확히 출력하기 위해 필요한 것입니다. 고맙습니다! – Natela

답변

0

귀하의 코드 당신은 읽기 및 쓰기에 대한 별도의 작업이 필요

filename = "solution09.txt" 
contents=File.read(filename) 

puts "Enter a noun: " 
noun=gets.chomp 

puts "Enter a verb: " 
verb=gets.chomp 

puts "Enter an adjective: " 
adj=gets.chomp 

puts "Enter an adverb: " 
adv=gets.chomp 

if contents.include?('NOUN') 
    { "\[NOUN\]" => noun, 
    "\[VERB\]" => verb, 
    "\[ADJ\]" => adj, 
    "\[ADV\]" => adv 
    }.each do |key, value| 
    contents.gsub!(key, value) 
    end 
    File.open(filename, "w") { |f| f << contents } 
end 

처럼 보일 것입니다. 할 수있는 다른 방법이있다이

당신은 또한 나오지도 명령 (시스템, 역 따옴표, peopen)

을 쉘과 상호 작용 루비 방법을 사용하고 사용할 수 있습니다 https://stackoverflow.com/a/10173112/1380263

하나의 파일 포인터를 수행하는 방법을 볼 수 있습니다

정말 상황에 맞는에 따라 달라집니다 최고의

+1

동일한 결과를 얻으려면 코딩하는 방법이 너무 많습니다. 이것은 모든 사람이 자신의 코딩 방법을 갖는 방법의 또 다른 예입니다. – Natela

0
file = File.read("solution09.txt") 
.gsub(/\[(NOUN|VERB|ADJ|ADV)\]/) do 
    part = case $1 
    when "NOUN" then "a noun" 
    when "VERB" then "a verb" 
    when "ADJ" then "an adjective" 
    when "ADV" then "an adverb" 
    end 
    puts "Enter #{part}: " 
    gets.chomp 
end 
+0

내 코드를 단축하는 좋은 방법입니다. 솔루션을 제공해 주셔서 감사합니다! – Natela

+1

이것은 OP 코드와 동일하지 않습니다. 매번 교체 할 때마다 프롬프트됩니다. (BTW, 당신의'case' 문장에'end'가 없습니다) – Stefan

+1

@Stefan 지적 해 주셔서 감사합니다. 나는 그것이 같은 것이 아니라는 것을 깨달았지만, 나는 OP의 의도에 대해 확신하지 못했습니다. – sawa

1

또한 대체 해시 구축 할 수 있습니다 :

을3210

그리고 그것을 통과 gsub에 :

contents.gsub(Regexp.union(replacements.keys), replacements) 

Regexp.union는 주어진 키 중 하나와 일치하는 패턴을 생성합니다.

관련 문제