2013-07-30 29 views
0

我試圖從命令行執行該程序,但我無法使用gets.chomp,而是返回鍵值。如何從終端運行文件時使用獲取?

我進入:ruby name_of_file.rb name_of_file.txt

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)} 

我知道程序並沒有完全執行凱撒密碼,我只是想弄清楚如何在命令行中運行,而無需使用撬或IRB 。

+0

從命令行運行程序時會發生什麼? –

+0

它打印關鍵值。所以如果txt文件有一行包含數字3,它會打印3. – evkline

回答

1

您想手動輸入密碼密鑰嗎?

使用STDIN.gets

+0

謝謝!所以如果你正在運行一個來自irc或pry的程序,你可以使用常規的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來獲取字符的實際序號值,而不是字節。

它更具可讀性,但可能無法完全滿足您的需求。