6

Ruby で getoptlong クラスを使用するのに助けが必要です。コマンド prog_name.ruby -u -i -s filename を実行する必要があります。これまでのところ、prog_name.ruby -u filename -i filename -s filename でしか実行できません。

これは私の getoptlong コードです:

require 'getoptlong'

class CommonLog
parser = GetoptLong.new
parser.set_options(["-h", "--help", GetoptLong::NO_ARGUMENT],
                   ["-u", "--url",  GetoptLong::NO_ARGUMENT],
                   ["-i", "--ip",   GetoptLong::NO_ARGUMENT],
                   ["-s", "--stat", GetoptLong::NO_ARGUMENT])

begin
  begin
      opt,arg = parser.get_option
      break if not opt

      case opt
         when "-h" || "--help"
           puts "Usage: -u  filename"
           puts "Usage: -i  filename"
           puts "Usage: -s  filename"
         exit
         when "-u" || "--url"
            log = CommonLog.new(ARGV[0])
            log.urlReport
         when "-i" || "--ip"
            log = CommonLog.new(ARGV[0])
            log.ipReport
         when "-s" || "--stat"
            log = CommonLog.new(ARGV[0])
            log.statReport
         end
      rescue => err
         puts "#{err.class()}: #{err.message}"
         puts "Usage: -h -u -i -s filename"
      exit
   end
end while 1

if ARGV[0] == nil || ARGV.size != 1
   puts "invalid! option and filename required"
   puts "usage: -h -u -i -s filename"
end
4

2 に答える 2

10

新しい「slop」gemを見ることをお勧めします。のラッパーgetoptlongです。

gem install slopRVMを使用している場合でも、そうでない場合でも使用できますsudo gem install slop

GetOptLong は非常に強力ですが、何度か使用しましたが、毎回ドキュメントを確認する必要があります。

「GetOptLong よりも使いやすいインターフェイス」でもう少し強力な機能が必要な場合は、Ruby のOptionParser. ロジックを改善する必要がありますが、これはコードを変換するクイック パスです。CommonLog gem を使用しないため、クラスをスタブ化する必要がありました。重要なものは、ログをプルする行の後に続きますARGV

require 'optparse'

class CommonLog
  def initialize(*args); end
  def urlReport();     puts "running urlReport()";        end
  def ipReport();      puts "running ipReport()";         end
  def statReport(arg); puts "running statReport(#{arg})"; end
end

log = CommonLog.new(ARGV[0])

OptionParser.new { |opts|
  opts.banner = "Usage: #{File.basename($0)} -u -i -s filename"

  opts.on( '-u', '--[no-]url', 'some short text describing URL') do
    log.urlReport()
  end

  opts.on('-i', '--[no-]ip', 'some short text describing IP') do
    log.ipReport()
  end

  opts.on('-s', '--stat FILENAME', 'some short text describing STAT') do |arg|
    log.statReport(arg)
  end
}.parse!

また、簡単な批評として、あなたは慣用的な Ruby コードを書いていません。

  • whenステートメントは次のように記述できます。when "-h", "--help"
  • if ARGV[0] == nil || ARGV.size != 1複雑です。ARGV と配列がどのように機能するかを調べてください。通常、ARGV[0]nil になるとそれ以上の引数はなくなるため、ARGV.empty?おそらく十分でしょう。
于 2011-04-16T21:01:41.087 に答える