ベストアンサー1
ほとんどの場合、外部パーサーは必要ありません。Scala のパターン マッチングを使用すると、関数型スタイルで引数を使用できます。例:
object MmlAlnApp {
val usage = """
Usage: mmlaln [--min-size num] [--max-size num] filename
"""
def main(args: Array[String]) {
if (args.length == 0) println(usage)
val arglist = args.toList
type OptionMap = Map[Symbol, Any]
def nextOption(map : OptionMap, list: List[String]) : OptionMap = {
def isSwitch(s : String) = (s(0) == '-')
list match {
case Nil => map
case "--max-size" :: value :: tail =>
nextOption(map ++ Map('maxsize -> value.toInt), tail)
case "--min-size" :: value :: tail =>
nextOption(map ++ Map('minsize -> value.toInt), tail)
case string :: opt2 :: tail if isSwitch(opt2) =>
nextOption(map ++ Map('infile -> string), list.tail)
case string :: Nil => nextOption(map ++ Map('infile -> string), list.tail)
case option :: tail => println("Unknown option "+option)
exit(1)
}
}
val options = nextOption(Map(),arglist)
println(options)
}
}
たとえば次のように印刷されます。
Map('infile -> test/data/paml-aln1.phy, 'maxsize -> 4, 'minsize -> 2)
このバージョンでは、1 つの infile のみを使用します。簡単に改善できます (リストを使用)。
また、この方法では、複数のコマンドライン引数 (2 つ以上) を連結できることにも注意してください。