gpt4 book ai didi

erlang - 使用 io_lib 实现 ~p 和 ~w 混合格式 :format

转载 作者:行者123 更新时间:2023-12-02 03:45:35 29 4
gpt4 key购买 nike

假设我有一个任意格式的字符串和一些相应的数据,并且数据包含带有字符串元素的元组。作为(缩短的)示例:

Format = "~p~n",
Data = {"ABC"},

出于特定目的,我想打印相同的输出,但只打印在一行上。我想实现与“~p”相同的格式(即 Data 应打印为 {"ABC"} 而不是 {[65,66,67 ]}。这可能吗?

我想我可以分三步完成:

  • io_lib:format~p
  • 循环生成的字符串并删除所有新行字符
  • 正则表达式将多个连续空格的所有序列替换为单个空格

但这种方法似乎乏味且低效。有没有更好的方法使用 OTP 函数来做到这一点?

最佳答案

正如legoscia 所指出的,io:format/2 尝试在 pretty-print 元素和行长度以及您可以通过格式字符串参数调整每个元素方面保持礼貌。请注意,这意味着如果您使用格式控制序列,则格式本身就是您控制每个元素的输出长度的位置。

允许您声明行的总长度(而不是每个元素)的替代方案是 io_lib:print/4 。我倾向于发现这个特定的函数对于日志消息格式化之类的事情更有用:

1> T = {"Some really long things","are in this tuple","but it won't really matter","because they will be in line"}.
{"Some really long things","are in this tuple",
"but it won't really matter","because they will be in line"}
2> io:format("~tp~n", [T]).
{"Some really long things","are in this tuple","but it won't really matter",
"because they will be in line"}
3> S = io_lib:print(T, 1, 1000, -1).
[123,
["\"Some really long things\"",44,"\"are in this tuple\"",
44,"\"but it won't really matter\"",44,
"\"because they will be in line\""],
125]
4> lists:flatten(S).
"{\"Some really long things\",\"are in this tuple\",\"but it won't really matter\",\"because they will be in line\"}"
5> io:format("~ts~n", [S]).
{"Some really long things","are in this tuple","but it won't really matter","because they will be in line"}
ok

阅读 io 的文档和 io_lib小心。实际上,里面包含了很多不时弹出的功能。

请记住,如果目标是控制终端本身,您还可以通过打印单个字符和使用 ASCII 控制序列来完成很多有趣的工作。使用 io:put_chars/1 逐个字符或按位 block 传输屏幕更新字符串输出如果您要解决的问题是构建基于文本的界面或类似的东西,那么它可能是一个强大的工具。

关于erlang - 使用 io_lib 实现 ~p 和 ~w 混合格式 :format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46886063/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com