Archive for 2月, 2011

Erlang 编译并运行程序

在 erl shell 中编译运行

ERLANG程序设计-code\code>erl
Eshell V5.8.2 (abort with ^G)
1> c(hello).
{ok,hello}
2> hello:start().
Hello world
ok
3>

在命令提示符下编译运行

ERLANG程序设计-code\code>erlc hello.erl
ERLANG程序设计-code\code>erl -noshell -s hello start -s init stop
Hello world

ERLANG程序设计-code\code>

快速脚本

-eval 参数可以在 os 命令行中执行任意的erlang函数,例如:

$ erl -eval ‘io:format(“Hello world~n”).’ -noshell -s init stop
Hello world
$ erl -eval ‘io:format(“Memory:~p~n”,[erlang:memory(total)]).’ -noshell -s init stop
Memory:2854918
$
上面这个命令在windows下无输出,原因是单引号的问题,将单引号换成双引号就可以了,可能是windows直接将单引号传递给了erl,被erl当作了原子了。
windows下需要执行下面的命令
D:\My Dropbox\Erlang\ERLANG程序设计-code\code>erl -eval “io:format(\”Hello world
\”).” -noshell -s init stop
Hello world
D:\My Dropbox\Erlang\ERLANG程序设计-code\code>
erlc hello.erl 编译文件hello.erl,生成名为hello.beam的目标代码文件。
-noshell 表示启动erlang,但是关闭shell,因此不会看到erlang提示信息。
-s hello start 表示运行函数 hello:start(). ,-s 执行模板函数时模板必须已经编译过,否则出现下面的错误:
ERLANG程序设计-code\code>erl  -noshell -s hello start -s init stop
{“init terminating in do_boot”,{undef,[{hello,start,[]},{init,start_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
-s init stop 表示运行 init:stop() 函数。当有多个 -s 参数时,会按顺序对每个-s命令有一个apply语句进行解释运行,一旦一个运行完毕,则继续执行下一个命令。

No comment »

导入测试数据到 Mnesia 数据库

假如我们开始玩一个关于健康食品的小型数据库,可输入下列数据到文件data.txt:

{tables,[
    {fruit, [{attributes, [name, color, taste]}]},
    {vegetable, [{attributes, [name, color, taste, price]}]}
]}.

{fruit, orange, orange, sweet}.
{fruit, apple, green, sweet}.
{vegetable, carrot, orange, carrotish, 2.55}.
{vegetable, potato, yellow, none, 0.45}.

下列Erlang shell会话显示如何加载fruits数据库:

 $ erl
Erlang (BEAM) emulator version 5.6.3 [source] [smp:2] [async-threads:0] [kernel-poll:false]

Eshell V5.6.3 (abort with ^G)
1> mnesia:start(). % 虽然 mnesia:load_textfile 也会启动数据库,但是在处理上次遗留的内存数据库上有问题,
会保留上次非正常退出时的内存表的结构,造成本次 mnesia:load_textfile 操作失败。出现注1的错误,造成无法导入本
次的数据。
ok
2> mnesia:load_textfile("data.txt").
New table fruit
New table vegetable
{atomic,ok}
3> mnesia:info().
---> Processes holding locks <--- ---> Processes waiting for locks <--- ---> Participant transactions <--- ---> Coordinator transactions <--- ---> Uncertain transactions <--- ---> Active tables <--- vegetable : with 2 records occupying 320 words of mem fruit : with 2 records occupying 312 words of mem schema : with 3 records occupying 622 words of mem ===> System info in version "4.4.3", debug level = none <=== opt_disc. Directory "/home/gamexg/erl/mnesia/Mnesia.nonode@nohost" is NOT used. use fallback at restart = false running db nodes = [nonode@nohost] stopped db nodes = [] master node tables = [] remote = [] ram_copies = [fruit,schema,vegetable] disc_copies = [] disc_only_copies = [] [{nonode@nohost,ram_copies}] = [schema,fruit,vegetable] 5 transactions committed, 0 aborted, 0 restarted, 0 logged to disc 0 held locks, 0 in queue; 0 local transactions, 0 remote 0 transactions waits for other nodes: [] ok 4>

这里我们能够看到怎样从一个规范的文本文件来初始化数据库管理系统。

注1:不使用mnesia:start 启动数据库直接载入数据会使上次运行的内存表未被清除,而和本次导入的表冲突,导入失败。

$ erl
Erlang (BEAM) emulator version 5.6.3 [source] [smp:2] [async-threads:0] [kernel-poll:false]

Eshell V5.6.3 (abort with ^G)
1> mnesia:load_textfile(“data.txt”).
** Table fruit already exists on nowhere, just entering data
** Table vegetable already exists on nowhere, just entering data
{aborted,{no_exists,fruit}}
2>

No comment »