getopt & main

Posted 2010年12月26日 by

コマンドラインのオプション

scalaのmain関数を使ってアプリケーションを作るとき、コマンドラインからファイルの指定やオプションを設定します。

データベースと接続するためのオプションには、4つのオプションが必要です。

  • JDBC
  • DSN (Data Source Name)
  • UserID
  • Password


プログラムの中では次のように定義されます。

	var drivrName = "oracle.jdbc.driver.OracleDriver"
	var dsn = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
	var user ="scott"
	var passwd ="tiger"



コマンドラインのオプションで指定するとなると、

-j  oracle.jdbc.driver.OracleDriver -d jdbc:oracle:thin:@127.0.0.1:1521:ORCL -u scott -p tiger

最近はコマンドラインを使うのは特別なことになっていますが、はやりコマンドラインで簡単に使いたい、バッチ処理に組み込みたいとなると、オプション処理が不可欠です。

UNIXには、getopt関数があってコマンドラインで指定されたオプションをループで処理できます。

CもJavaもScalaも文字列配列で定義されます。

Cは、

int main(int argc, char *argv[])

Javaであれば、

public static void main(String[] args) 

Scalaであれば、

def main(args : Array[String]) : Unit = 


getopt

Scalaでgetoptのようなことをするためにプログラムしました。
Cのgetoptでは、オプションに値を伴うものと伴わないものを指定できますが、
そのようなチェックをしていません。

深く考えて実装していないので、バグがあれば教えてください。


package hello

import scala.collection.mutable.ArrayBuffer
import scala.reflect.{BeanProperty,BeanInfo}

@BeanInfo
class argOption(
	@BeanProperty var opt:String
	,@BeanProperty var values:Array[String]
){
	def this(o:String) = this(o,null)
	override def toString :String ={
		var c = ""
		if(values != null){
			values.foreach(v => {c += v + " "})
		}
		"-" + opt + " " + c.trim
	}
}
object opt {
	def getopt(args : Array[String]):List[argOption] = {
		var opts = new ArrayBuffer[argOption]
		var values = new ArrayBuffer[String]
		var opt:argOption = null
		var optStr:String = null
		var fg = false //out
		for(i <- 0 to args.length-1){
			val arg = args(i)
			if(arg.startsWith("-")){
				if(fg){ // in
					if(opt != null){
						opt.setValues(values.toArray)
						values = new ArrayBuffer[String]				
					}
				}else { // out
					fg = true // in
				}
				opt = new argOption(arg.substring(1))
				opts.append(opt)
			}else{
				if(!fg){
					opt = new argOption("")
					opts.append(opt)
					fg = true
				}
				values.append(arg)
				if(i == args.length-1){
					opt.setValues(values.toArray)
				}
			}
		}
		opts.toList
	}

	def main(args : Array[String]) : Unit = {
		getopt(args).foreach(v =>{
			println(v.toString)
			if("j".equals(v.opt)){println("---- jdbc driver ["+v.values(0)+"]")}
			else if("d".equals(v.opt)){println("---- dns ["+v.values(0)+"]")}
			else if("u".equals(v.opt)){println("---- userid ["+v.values(0)+"]")}
			else if("p".equals(v.opt)){println("---- password ["+v.values(0)+"]")}
			else if("driver".equals(v.opt)){println("---- jdbc driver ["+v.values(0)+"]")}
			else if("dns".equals(v.opt)){println("---- dns ["+v.values(0)+"]")}
			else if("userid".equals(v.opt)){println("---- userid ["+v.values(0)+"]")}
			else if("password".equals(v.opt)){println("---- password ["+v.values(0)+"]")}
		})
  }
}


使い方は、mainに書かれているようにif文で処理します。
オプションは値を伴う前提でコードが書かれています。

先のオプションで実装した結果です。

-j oracle.jdbc.driver.OracleDriver
---- jdbc driver [oracle.jdbc.driver.OracleDriver]
-d jdbc:oracle:thin:@127.0.0.1:1521:ORCL
---- dns [jdbc:oracle:thin:@127.0.0.1:1521:ORCL]
-u scott
---- userid [scott]
-p tiger
---- password [tiger]


次のようにオプションしていすると、

-driver  oracle.jdbc.driver.OracleDriver -dns jdbc:oracle:thin:@127.0.0.1:1521:ORCL -userid scott -password tiger

結果は、

-driver oracle.jdbc.driver.OracleDriver
---- jdbc driver [oracle.jdbc.driver.OracleDriver]
-dns jdbc:oracle:thin:@127.0.0.1:1521:ORCL
---- dns [jdbc:oracle:thin:@127.0.0.1:1521:ORCL]
-userid scott
---- userid [scott]
-password tiger
---- password [tiger]

Post Details

  • Post Title: getopt & main
  • Author: admin
  • Filed As: Scala
  • Tags:
  • You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す