关于Erlang的模式匹配列表的加深理解

本文深入解析了Erlang编程环境中字符串与列表的区别,详细讲解了如何在字符串与整数间进行模式匹配,以及如何通过模式提取单个字符。同时,文章还介绍了如何将整数转换为字符串,字符串连接方法,并展示了如何将列表数据写入文件而不使用中括号的方法。通过实例演示了Erlang中数据类型之间的转换,如整数、字符串、元组和列表之间的相互转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.本来是想实现这个功能:就是把<<"1">>变为"1":

一般用模式匹配来提取

183132_4nEW_1540325.png

本来认为Z="1"来着,结果打印Z为49,然后打印"1"的结果却为“1”。

后来经我们组的leader的引导:

183615_yIpG_1540325.png

可以看出[49]才等于"1"        而49不等于"1" ,我们直到因为在erlang编程下,字符串其实就是列表,而单个字符不是列表,单个字符是列表项中的每一项元素。

所以  你的两个打印函数 等同于

io:format("~p~n", [49]).     
io:format("~p~n", [[49]]).

202002_tnZP_1540325.png

为什么这个模式匹配没有提出"1"呢?

答:<<Z,_/binary>> = <<"1">>. 这个表达式其实就是列表的模式提取Z其

实就是提取了列表头(这句话是错的),Z为字符1,所有整数就49。

Z就像是列表头,提出来了之后,列表头不是列表,而列表尾才是列表

比如[1,2,3,4,5] = [T|P] 列表头T为整数1,而不是列表[1],而列表为P还是一个列表为[2,3,4,5]。

 

由此可以得出本文开头的那个问题的解决办法:这个解决办法是正确的

202634_z9jq_1540325.png

但是上面的解释是错的,其实<<"1">>里面的"1"不是一个列表,只是代码这个字符‘1’,然后底层用其ASII码存起来就是49

195936_xtN5_1540325.png

总结:二进制类型里面只有放整数和字符串,别的类型会失败 

200953_Xjuy_1540325.png          

整数:例如<<1,2,3>>表示底层1,2,3存放的8位二进制,

              字符串:如下,其实就是其对应存放的ASCII码

201113_UYJ8_1540325.png

     其二进制里面的字符串还有下面的这种现象:

201443_AMah_1540325.png

下面其实关于<<"1">>里面的"1"代表字符'1'的ASCII码与单独的"1"字符串是列表的区别可以通过一下图也是可以的:

201910_te4f_1540325.png

P提取的是字符'1',其ASCII码为49,但是其实还有一个Q=[]空列表,所以字符串"1"其实就是[49]

再来看看<<"1">>的同样用两个来提取。

202402_82pt_1540325.png

可以看得到Z提取的是字符'1',其ASCII码为49,和上面一样,后面的Rest为空二机制,不是空列表,可以看出其区别,在二进制里面的字符串不是列表。

2 在erlang里面把整数1变为字符串“1”

也就是列表[49],理解了这一点,就很容易做了,如下:

203325_knJZ_1540325.png

因为“1”其实是列表[49],所以将将其放在列表里面,然后加上48,就行了,别的数字加上对应的就可以了

3字符串的连接

因为字符串在erlang里面就是列表,所以可以用这个字符++来连接,就像连接列表一样,如下示例:

203723_j2Dc_1540325.png

4 写erlang列表数据到文件里面但是不带中括号[]

用io:format格式化输出,~s: 打印字符串的时候会不带[]和“”

205345_wPqp_1540325.png

下面有个大的例子,写入列表的数据到文件,但是不要中括号[]

205020_duM6_1540325.png

编译erlc mylib_misc.erl,编译好了之后去运行,效果如下:

205614_sRwz_1540325.png

 

后面补充,发现有内置函数,比如<<"1">>变为“1”,有 binary_to_list ; 然后整数1变为"1"有integer_to_list

实现起来就更为简单了

094903_gH2P_1540325.png

其实erlang各种数据类型之间的转换,都有,下面有元组和列表之间的转换,还有列表到二进制之间的转换,由此可以推出,应该各种类型之间的转换都有

101626_9fET_1540325.png

转载于:https://my.oschina.net/u/1540325/blog/394366

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值