Erlangにおけるデータ構造の読み込みとダンプ
なんとなく最近Erlangを勉強している.
普段使いの言語でよく使う操作はできるようになりたいので,とりあえずPerlで言うところのData::Dumper, eval相当の操作をErlangでやってみる.
今回はデータ構造の読み込みを行うfile:consultと,その逆操作を行う関数を自作してみる.
Programming Erlangのp.222とp.228より.
- data1.dat
{person, "joe", "armstrong", [{occupation, programmer}, {favoriteLanguage, erlang}]}. {cat, {name, "zorro"}, {owner, "joe"}}.
file:consultを使うとそのままデータとして読み込むことができる.
1> {ok, L} = file:consult("data1.dat"). {ok, [{person, "joe", "armstrong", [{occupation, programmer},{favoriteLanguage, erlang}]}. {cat, {name, "zorro"},{owner, "joe"}}]} 2> L. [{person, "joe", "armstrong", [{occupation, programmer},{favoriteLanguage, erlang}]}. {cat, {name, "zorro"},{owner, "joe"}}]}
うまく読み込めていることが確認できた.
この逆操作を行うものが存在しないそうなので自前で作成する.(Programming Erlang p.228)
- lib_misc.erl
-module(lib_misc). -export([unconsult/2]). unconsult(File, L) -> {ok, S} = file:open(File, write), lists:foreach(fun(X) -> io:format(S, "~p.~n", [X]) end, L), file:close(S).
作成したモジュールのlib_misc:unconsultの動作を確認する.
lib_misc:unconsultで書き出したファイルをconsultでL2に読み込み,Lと一致するかを確認する.
3> c("./lib_misc") {ok,lib_misc} 4> lib_misc:unconsult("data2.dat", L). ok 5> {ok, L2} = file:consult("data2.dat"). {ok, [{person, "joe", "armstrong", [{occupation, programmer},{favoriteLanguage, erlang}]}. {cat, {name, "zorro"},{owner, "joe"}}]} 6> L2 == L. true
念のためdata2.datの中身も見てみる.
% cat data2.dat {person,"joe","armstrong", [{occupation,programmer},{favoriteLanguage,erlang}]}. {cat,{name,"zorro"},{owner,"joe"}}.
きちんと吐き出せている.
早く並列プログラミングできるようになりたいなぁ.
Reference
Programming Erlang: Software for a Concurrent World
- 作者: Joe Armstrong
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2007/07/01
- メディア: ペーパーバック
- 購入: 1人 クリック: 22回
- この商品を含むブログ (26件) を見る