Erlang io打印时遇到的坑
Erlang io打印时遇到的坑
今天遇到一个bug找了一个多小时,最后发现是一个标点符号引起的,在这里记录一下
不管底层是用io:format还是io_lib:format都绕不开这个问题,当时在做一个邮件的需求,放了一个参数传给~ts解析,一直报错找不到原因,最后发现是文本里面带了一个浪号 ~
比如我想打印 666 ×××真厉害~,代码就是
io:format("666 ~ts真厉害~",["你"]).
运行后直接报错,不管是io:format或者io_lib:format都会报错
1> io:format("666 ~ts真厉害~",["你"]).
** exception error: bad argument
in function io:format/3
called as io:format(<0.63.0>,
[54,54,54,32,126,116,115,30495,21385,23475,126],
[[20320]])
2> io_lib:format("666 ~ts真厉害~",["你"]).
** exception error: bad argument
in function io_lib:format/2
called as io_lib:format([54,54,54,32,126,116,115,30495,21385,23475,126],[[20320]])
3>
直接说问题出现在哪里吧,如果有参数的话是不能在整个文本使用浪号的,不用的话就没问题了
3> io:format("666 ~ts真厉害!",["你"]).
666 你真厉害!ok
4> io_lib:format("666 ~ts真厉害!",["你"]).
[54,54,54,32,[20320],30495,21385,23475,33]
5>
确实昂,瞬间没那味儿了
查看源码发现,在io_lib:format/2中调用了io_lib_format:fwrite/2
再往下调用io_lib_format的scan/2函数
我们传进来的指定不是atom也不是binary,那就走collect了
好家伙,破案了,只要是浪号,直接匹配出来单独解析
建议是不用咯
还没有评论,来说两句吧...