2013-07-17 4 views
1

루비에서 해쉬를 사용하고 있습니다. 특정 단어가 "쌍"클래스에 있는지 확인하고 바꿉니다. 처음에 저는 파이썬으로 코드를 작성하고 그것을 익숙하지 않은 루비로 변환하려고합니다. 여기 제가 작성한 루비 코드가 있습니다.루비에서 해시하고 파이썬을 루비로 변환

import sys 

pairs = dict() 

pairs = {'butter': 'flies', 'cheese': 'wheel', 'milk': 'expensive'} 

for line in sys.stdin: 
    line = line.strip() 
    line_words = line.split(" ") 
    for word in line_words: 
    if word in pairs: 
     line = line.replace(word ,pairs[word]) 

print line 

이 때문에 "수입 SYS"또는 "들여 쓰기"의인가 아래 권리 원래 파이썬 스크립트이지만

import sys 

pairs = {'butter' => 'flies', 'cheese' => 'wheel', 'milk'=> 'expensive'} 

for line in sys.stdin: 
    line_words = line.split(" ") 
    for word in line_words: 
     if word in pairs 
     line = line.gsub!(word, pairs[word]) 

puts line 

그것은 다음과 같은 오류를

syntax error, unexpected kIN, expecting kTHEN or ':' or '\n' or ';' 
     if word in pairs 
       ^

을 보여줍니다?

답변

1

시험해보기 :

pairs = {'butter' => 'flies', 'cheese' => 'wheel', 'milk'=> 'expensive'} 

line = ARGV.join(' ').split(' ').map do |word| 
    pairs.include?(word) ? pairs[word] : word 
end.join(" ") 

puts line 

이렇게하면 스크립트에 전달 된 각 항목을 반복하고 단어 또는 대체 단어를 공백으로 결합하여 반환합니다.

+0

감사합니다. kardeiz! 루비가 "넣는"행의 유형은 무엇입니까? 배열입니까? 행 단위로 한 단어 씩 인쇄하기 때문에 두 행을 분리했는지 궁금합니다. 그래도 전체 라인을 뽑아 내고 싶다면 어떻게해야합니까? line.join ("")은 문제를 해결할 수 없습니다. – user2592038

+0

안녕하세요! 입력시 따옴표를 붙일 때 차이점을 발견했습니다. 예를 들어, "this is butter"라고 입력하려고하면 "this is butter"라고 인쇄됩니다. "이것이 버터입니다" "이면 출력은"이것은 파리 "입니다. 차이점은 무엇입니까? 그리고 서버에 코드를 넣을 때 "this is butter": String (NoMethodError) "에 대한 정의되지 않은 메서드'map '이라는 오류가 있습니다. – user2592038

+0

변환 할 문자열을 인수의 시퀀스 또는 하나의 인용 부호로 묶을 수 있도록 스크립트를 약간 수정했습니다 :'ARGV.join ('') .split ('')', arg 배열을 공백으로 분리 한 다음 공백으로 분리합니다. 두 번째 문제에 대해 잘 모르겠습니다. 스크립트가 호출되는 컨텍스트는 무엇입니까? 오류는 'ARGV'가 문자열로 해석되지만 ARGV는 항상 배열이어야합니다 (비어있는 경우에도 마찬가지). –

0

for은 Ruby에서 일반적으로 사용되지 않습니다. 일부 예외적 인 범위가 있기 때문에 일반적으로 사용되지 않습니다. 여기

내가 그것을 쓸 것입니다 방법은 다음과 같습니다

pairs = { "butter" => "flies", "cheese" => "wheel", "milk" => "expensive" } 
until $stdin.eof? 
    line = $stdin.gets 
    pairs.each do |from, to| 
    line = line.gsub(from, to) 
    end 

    line 
end 

import

루비에 존재하지 않는, 즉 거기해서는 안. Ruby에서 각 블록을 end으로 "닫아야"하는 경우, 들여 쓰기만으로는 충분하지 않습니다 (들여 쓰기가 루비에 아무런 의미가 없습니다. 가독성을 위해 계속 사용해야 함).

관련 문제