コマンドラインのオプション
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]
コメントを残す
コメントを投稿するにはログインしてください。