<?php

Currently browsing erlang

关于erlang的md5计算函数

erlang模块中提供了一个md5函数,但是这个函数返回的并不是通常使用的32位字符。官方文档解释如下:

erlang:md5(Data) -> Digest

* Data = iodata()
* Digest = binary()

Computes an MD5 message digest from Data, where the length of the digest is 128 bits (16 bytes). Data is a binary or a list of small integers and binaries.

See The MD5 Message Digest Algorithm (RFC 1321) for more information about MD5.

时间宝贵啊,暂时是不打算去看什么RFC 1321了,因此还是放狗吧。
得到以下解决办法:

-module(md5).
-compile(export_all).

md5(S) ->
    Md5_bin =  erlang:md5(S),
    Md5_list = binary_to_list(Md5_bin),
    lists:flatten(list_to_hex(Md5_list)). 

list_to_hex(L) ->
    lists:map(fun(X) -> int_to_hex(X) end, L). 

int_to_hex(N) when N < 256 ->
    [hex(N div 16), hex(N rem 16)].

hex(N) when N < 10 ->
    $0+N;
hex(N) when N >= 10, N < 16 ->
    $a + (N-10).

保存、编译、执行 md5:md5(”123456″).
得到: e10adc3949ba59abbe56e057f20f883e
到此搞定了。
再次感谢一下博主! 原文地址

Erlang入门第二期:Erlang“记录”的用法及注意事项

15. 记录 record

提供了一种方法吧一个名称与元组中的一个元素对应起来,从而便于区分元组中的各个元素的含义。定义方法:

-record(Name, { key1 = Default1, key2 = Default2, key3, key4=undefined, ….}

其中key3 key4=undefined 是等效写法;

Name:记录的名字;

Key1, key2, key3, key4 这些是记录中的字段名,且必须是元子;

注意:record 不是一个shell命令,不能在shell中使用,只能用于erlang源码中;在shell中应该使用rr命令读取hrl记录定义文件

保存为 .hrl 扩展名的文件,以保证不同的erlang模块使用相同的记录定义

保存为records.hrl

%%记录 定义

-record(

todo,

{

status=abc,

who=usr,

text

}

).

Shell中执行:

1> rr(”records.hrl”).

[todo]

2> X1 = #todo{}.

#todo{status = reminder,who = joe,text = undefined}

3> X2 = #todo{who=zhys9, text=”erlang”}.

#todo{status = reminder,who = zhys9,text = ”erlang”}

4> X3 = X2#todo{text=”copy of X2″}.

#todo{status = reminder,who = zhys9,text = ”copy of X2″}

5> X3#todo.text.

“copy of X2″

6> X2#todo.text.

“erlang”


说明一下:

1> 加载记录定义

2> 实例化一个todo类型的记录,所有字段值都按照记录的默认值

3> 实例化一个todo类型的记录,并指定whotext字段的值

4> copy变量X2并修改text字段的值为copy of X2,赋值给X3

5> 通过记录,获取X3text字段的值

6> 通过记录,获取X2text字段的值

特别注意的是,X3X2copy与被copy的关系,当X3的字段值发生改变后,X2的字段没有变化!

另外一种从记录中提取字段值的方法依旧是模式匹配:

7> #todo{status=Y, who=Z,text=T}=X2.

#todo{status = reminder,who = zhys9,text = ”erlang”}

8> Y.

12

9> Z.

zhys9

10> T.

“erlang”

Erlang入门注意事项,第一期

最近在看Erlang的介绍,对于一个入门级的新人而言,erlang还是有不少需要注意的地方。先简单整理一下,自己备忘或是方便新人吧。。这里记录不是很详细,只是记录了一部分我认为需要特别注意的地方。

1. 变量首字母必须是大写

2. 元子(Atoms):元子是在Erlang中的另一个数据类型。元子以小写字母开头,元子只是一个简单的名字,其它什么都不是。他们不

像变量可以带有一个值。也可以用单引号括起来声明一个元子,此时可使用大写字母开头或包含其他字符 (类似枚举)

3. 元组(Tuple) - 元素 (类似对象)

C:\Documents and Settings\zhys9>erl

Eshell V5.7.5  (abort with ^G)

1> A=a.

a

2> B=b.

b

3> C={char, A,B}.

{char,a,b}

4> {char, First, Second} = C.

{char,a,b}

5> First.

a

在复杂结构的元组中提取变量的另一种提取方式:(使用匿名变量)

6> {_,First1,_}=C.

{char,a,b}

11> First1.

a

4. 列表 (类似数组)

5. 字符串 必须使用双引号; erl并没有字符串类型,取而代之我们可以提供一个由ASCII字符组成的列表。实际上是一个整数列表;用$a获取字母aASCII码值;

6. 变量在它的上下文(作用域)中,只能赋值一次

7. 函数format/2(format带有2个参数)带有两个列表。第一个列表几乎总是在“”中列出。这个列表原样输出,除了~w被使用第二个参数中的对相的元素替换了。每个~n都是一个新行。io:format/2函数自身返回一个元子ok,如果一切都按计划正确执行的话。

8. 注释%开始,直到本行结束。 如 % comments (意味着不能通%来取模了)

9. 外部函数在一个模块中声明多个外部可访问的函数:-export([fac/1, mult/2]). 另:局部函数无需在此声明

10. 守卫 guard 在《Erlang程序设计》中被称为断言

list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->

list_max(Rest, Head);

list_max([Head|Rest], Result_so_far)  ->

list_max(Rest, Result_so_far).

只有很少一部分的内建函数,可以于用守卫,你也无法在守卫中使用你自己定义的函数。

11. 匿名函数fun

fun可以拥有任意多个参数

1> Fun = fun(A, B) -> A*B end.

#Fun<erl_eval.12.113037538>

2> Fun(2,5).

10

3> Muti=Fun.

#Fun<erl_eval.12.113037538>

4> Muti(3,9).

27

12. 高阶函数:能够返回fun或接受fun作为参数的函数

13. 列表解析

5> Foo = [{2,2},{3,3},{4,4}].

[{2,2},{3,3},{4,4}]

6> [A*B || {A, B} <- Foo].

[4,9,16]

7> lists:sum([A*B || {A, B} <- Foo]).

29

14. 取余数:6 rem 5 值是1; 取整除数: 7 div 2 值是3

很不错的erlang中文手册,适合新手入手

比较好的一个erlang中文手册,适合新手入手。
如果需要请点击这里下载,感谢译者。
注意:需要安装pdf阅读器,如果你不想安装。
请在线查看:http://www.docin.com/p-47521830.html
如果你打算安装一个阅读器,推荐:Foxit

下面摘抄一下文档目录:
目录
译者 注…………………………………………………..I
其它译者………………………………………………….II
第1部分 入门………………………………………………1
1.1 简介……………………………………………….1
1.1.1 简介……………………………………………1
1.1.2 其它方面 ………………………………………..1
1.2 顺序编程 ……………………………………………1
1.2.1 Erlang Shell …………………………………..1
1.2.2 模块和函数 ………………………………………3
1.2.3 元子(Atoms) …………………………………….6
1.2.4 元组 …………………………………………..7
1.2.5 列表 …………………………………………..8
1.2.6 标准模块及用户手册 ……………………………….11
1.2.7 将输出写到终端上 …………………………………11
1.2.8 一个更大的例子 …………………………………..12
1.2.9 变量的匹配、守卫和作用域 …………………………..14
1.2.10 更多关于列表 …………………………………..16
1.2.11 If和Case……………………………………..21
1.2.12 内建函数(BIFs) …………………………………25
1.2.13 复杂函数……………………………………….27
1.3 并行编程……………………………………………29
1.3.1 进程…………………………………………..29
1.3.2 信息传递………………………………………..31
1.3.3 进程名称注册…………………………………….35
1.3.4 分布式编程………………………………………36
1.3.5 一个更大的例子……………………………………40
1.4 [#1]健壮性(Robustness 鲁棒性)…………………………49
1.4.1 超时(Timeouts)………………………………….49
1.4.2 错误处理………………………………………..51
1.4.3 增强健壮性之后的大型例子……………………………54
1.5 [#1]记录和宏(Records and Macros)………………………59
1.5.1 将大型的例子分割在多个文件中…………………………59
1.5.2 头文件(Header Files)…………………………….64
1.5.3 记录(Records)…………………………………..64
1.5.4 宏(Macros)……………………………………..65
第2部分 OTP设计原则………………………………………..66
2.1 概述………………………………………………66
2.1.1 监督树…………………………………………66
2.1.2 Behaviour……………………………………..66
2.1.3 应用…………………………………………..70
2.1.4 发布…………………………………………..71
2.1.5 发布控制………………………………………..71
2.2 Gen_Server Behaviour(文档缺失)………………………..71
2.3 Gen_Fsm Behaviour………………………………….71
2.3.1 有限状态机………………………………………71
2.3.2 实例…………………………………………..72
2.3.3 启动一个Gen_Fsm…………………………………73
2.3.4 事情通知………………………………………..74
2.3.5 超时…………………………………………..74
2.3.6 All状态事件…………………………………….75
2.3.7 停止函数………………………………………..75
2.3.7.1 在监督树中…………………………………..75
2.3.7.2 独立Gen_Fsm…………………………………76
2.3.8 处理其它消息…………………………………….76
2.4 Gen_Event Beheaviour……………………………….77
2.4.1 事件处理原则…………………………………….77
2.4.2 实例…………………………………………..77
2.4.3 启动一个事件管理器………………………………..78
2.4.4 加入一个事件处理器………………………………..78
2.4.5 事件通知………………………………………..79
2.4.6 删除一个事件处理函数……………………………….80
2.4.7 停止…………………………………………..80
2.4.7.1 在监督树中…………………………………..80
2.4.7.2 独占式事件管理器………………………………80目录

linux下erlang之OTP编译安装

在安装otp时遇到了一点问题,整体的安装过程比较简单。

wget http://erlang.org/download/otp_src_R13B04.tar.gz
tar xzf otp_src_R13B04.tar.gz
cd otp_src_R13B04
./configure --prefix=/home/erlang

configure之后发现有以下提示信息:
[code lang="code"]
*********************************************************************
********************** APPLICATIONS DISABLED **********************
*********************************************************************

odbc : ODBC library - link check failed
jinterface : No Java compiler found

*********************************************************************
*********************************************************************
********************** APPLICATIONS INFORMATION *******************
*********************************************************************

wx : wxWidgets not found, wx will NOT be usable

*********************************************************************
*********************************************************************
********************** DOCUMENTATION INFORMATION ******************
*********************************************************************
[/code]

我们只需要关注APPLICATIONS DISABLED部分的提示信息,至于其他提示信息需要根据使用情况酌情处理。
这里我只需要解决APPLICATIONS DISABLED部分的问题:
1,安装unixODBC和unixODBC-devel,解决第一个问题;
2,因为我这里用不上java编译了,因此可以在configure时增加 –disable-javac 避免第二个错误;

yum install unixODBC unixODBC-devel
./configure --prefix=/home/erlang --without-javac
make && make install

ok, 安装成功了。
下面给erl做一个软连接到/usr/local/bin/,以方便使用

ln -s /home/erlang/bin/erl /usr/local/bin/erl

测试一下:

bash-3.2# erl
Erlang R13B04 (erts-5.7.5) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
1> EvenN = lists:filter (fun (N) -> N rem 2 == 0 end, lists:seq (1,100)).
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,
 44,46,48,50,52,54,56,58|...]
2> halt().
bash-3.2#

注:以上操作在centOS5下完成。