2013-07-30 3 views
0

이 프로그램을 명령 줄에서 실행하려고하는데 gets.chomp을 사용할 수 없으며 대신 키 값을 반환합니다.터미널에서 파일을 실행할 때 gets를 사용하려면 어떻게해야합니까?

나는 입력 오전 :

def caesar_cipher(key) 
    s = gets.chomp 
    encoded = "" 

    s.each_byte do |l| 
    if ((l >= 65 && l <= 90) || (l >= 97 && l <= 122)) 
     encoded += (l+key).chr 
    else 
     encoded += l.chr 
    end 
    end 
    encoded 
end 

File.readlines(ARGV[0]).map(&:to_i).each {|key| puts caesar_cipher(key)} 

ruby name_of_file.rb name_of_file.txt 나는 프로그램이 완전히 시저 암호를 실행하지 않습니다 알고, 난 그냥 명령 줄에서 실행하는 방법을 알아 내려고 노력하고 있어요 놀리려는 또는 IRB를 사용하지 않고도 .

+0

명령 줄에서 프로그램을 실행하면 어떻게됩니까? –

+0

키 값을 인쇄합니다. 따라서 txt 파일에 숫자 3이 포함 된 줄이 있으면 3을 인쇄합니다. – evkline

답변

1

수동으로 암호 키를 입력 하시겠습니까?

사용 STDIN.gets

+0

감사합니다! 따라서 irc에서 프로그램을 실행하거나 일반 gets.chomp를 사용할 수 있다면 명령 행에서 실행 중일 때 STDIN을 사용해야합니까? – evkline

+0

또는 STDIN 대신'$ stdin'을 사용하십시오. 프로그램이 실행될 때, 그들은 같지만'$ stdin'을 조용히 뭔가 다른 것으로 바꿀 수 있습니다. 'STDIN'을 다른 것으로 변경하면 "이미 초기화 된 상수"경고가 발생합니다. –

+0

다른 파이프에서 입력이 필요할 때'$ stdin'을 임시로 변경하는 것이 일반적입니다. 그 필요성이 끝나면'$ stdin'을 다시 STDIN에 재 할당하십시오. 이것은 파이프에 해당됩니다. 우리가 매일 사용하는 공통 스트림에 대해 조금 읽었을 것입니다 ... https://en.wikipedia.org/wiki/Standard_streams와 STDLIB의 Ruby open3 클래스 (http://ruby-doc.org/stdlib-2.0) /libdoc/open3/rdoc/Open3.html – vgoff

1

@vgoff는 대답을 가지고 있지만, 여기에 내가 더 읽을 수하기 위해 코드를 다시 작성 줄 방법은 다음과 같습니다

가 대신 바이트로 분할 문자
def caesar_cipher(key) 

    encoded = "" 

    s = STDIN.gets.chomp 

    s.each_char do |l| 
    case l 
    when 'A' .. 'Z', 'a' .. 'z' 
     encoded += (l.ord + key).chr 
    else 
     encoded += l 
    end 
    end 

    encoded 

end 

# File.readlines(ARGV[0]).map(&:to_i).each {|key| puts caesar_cipher(key)} 
puts caesar_cipher(0) 
puts caesar_cipher(1) 

, 아마 사용하십시오 each_char 문자 인코딩을 유지합니다. case 문을 사용하여 두 범위를 대문자와 소문자를 깔끔하게 정의하고 ord을 사용하여 바이트 대신 문자의 실제 서수 값을 가져옵니다.

더 읽기 쉽지만 사용자의 요구를 완전히 충족시키지 못할 수도 있습니다.

관련 문제