「ほっ」と。キャンペーン

コマンドライン引数を受け取る

Haskell のプログラムにコマンドライン引数を受け取れるようにするにはどうすればいいか検索したら、System モジュールの getArgs 関数を使うと、簡単にコマンドライン引数を配列として受け取ることができることが分かった。つまり、

import System.Environment (getArgs)

main = do
  args <- getArgs
  print args

のようにできる。これを、getargs.hs のようなファイルにして ghci ではなく、コマンドプロンプト上で、

>ghc -o getargs getargs.hs

としてコンパイルして、getargs.exe をコマンドプロンプトで実行すればいい。

>getargs hello world
["hello", "world"]

これでは、いちいち ghci から出なければならないので少々不満だ。そこで、getargs.hs を :load コマンドで ghci に取り込んで、:main コマンドで実行させてみた。

Prelude> :l getargs.hs
Ok, modules loaded: Main.
Prelude Main> :main hello world
["hello","world"]

main 関数を呼ぶのではなく、:main コマンドを使っているのは、ghci 上では main 関数は引数を取ることができないからだ。

コマンドライン引数を受け取るのに、:main コマンドを使えばいいのが分かったので、:m コマンドでSystem モジュールをインポートして、let 宣言で main 関数を ghci の中で定義してやれば、いちいちファイルを作成しなくても試せるのではないかと考えてやってみたのが次の例だ。

Prelude> :m System.Environment
PreludeSystem.Environment> let main = do args <- getArgs; print args
Prelude System.Environment> :main hello world
["hello","world"]

成功だった。これで、簡単にコマンドライン引数を受け取るプログラムを ghci で試すことができるようになった。ただ、この方法では * のようなワイルドカードを使って引数を展開して与えるようなことはできない。この場合はやはり、正当にコマンドプロンプトでコンパイルして実行する必要がある。

getArgs の使い方が分かったので、コマンドライン引き数をつないで表示するプログラムを作ってみた。

Prelude> :m System
Prelude System> let main = do args <- getArgs; putStrLn $ concat args
Prelude System> :main hello world
helloworld

このように、Haskell でコマンドライン引き数を受け取るのは非常に簡単であることが分かった。
[PR]
by tnomura9 | 2011-11-18 22:53 | Haskell | Comments(0)
<< Haskell 版 cat あきら様 >>