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

我知道程序没有完全执行凯撒密码,我只是想弄清楚如何从命令行运行它而不必使用 pry 或 irb。

4

2 回答 2

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来获取字符的实际序数值,而不是字节。

它更具可读性,但可能无法完全满足您的需求。

于 2013-07-30T02:30:47.973 回答
1

您想手动输入密码吗?

利用STDIN.gets

于 2013-07-30T02:06:49.877 回答