Erlang io打印时遇到的坑

叁歲伎倆 2022-08-28 02:52 348阅读 0赞

Erlang io打印时遇到的坑

今天遇到一个bug找了一个多小时,最后发现是一个标点符号引起的,在这里记录一下

不管底层是用io:format还是io_lib:format都绕不开这个问题,当时在做一个邮件的需求,放了一个参数传给~ts解析,一直报错找不到原因,最后发现是文本里面带了一个浪号 ~

比如我想打印 666 ×××真厉害~,代码就是

  1. io:format("666 ~ts真厉害~",["你"]).

运行后直接报错,不管是io:format或者io_lib:format都会报错

  1. 1> io:format("666 ~ts真厉害~",["你"]).
  2. ** exception error: bad argument
  3. in function io:format/3
  4. called as io:format(<0.63.0>,
  5. [54,54,54,32,126,116,115,30495,21385,23475,126],
  6. [[20320]])
  7. 2> io_lib:format("666 ~ts真厉害~",["你"]).
  8. ** exception error: bad argument
  9. in function io_lib:format/2
  10. called as io_lib:format([54,54,54,32,126,116,115,30495,21385,23475,126],[[20320]])
  11. 3>

直接说问题出现在哪里吧,如果有参数的话是不能在整个文本使用浪号的,不用的话就没问题了

  1. 3> io:format("666 ~ts真厉害!",["你"]).
  2. 666 你真厉害!ok
  3. 4> io_lib:format("666 ~ts真厉害!",["你"]).
  4. [54,54,54,32,[20320],30495,21385,23475,33]
  5. 5>

确实昂,瞬间没那味儿了

查看源码发现,在io_lib:format/2中调用了io_lib_format:fwrite/2

image-20211028200333892

再往下调用io_lib_format的scan/2函数

image-20211028200402600

我们传进来的指定不是atom也不是binary,那就走collect了

image-20211028200449551

好家伙,破案了,只要是浪号,直接匹配出来单独解析

image-20211028200504363

建议是不用咯

image-20211028200624316

发表评论

表情:
评论列表 (有 0 条评论,348人围观)

还没有评论,来说两句吧...

相关阅读