【问题标题】:Erlang - io:format 's result / (formatting with io_lib:format/2)Erlang - io:format 的结果 / (使用 io_lib:format/2 格式化)
【发布时间】:2012-10-30 05:41:27
【问题描述】:

我正在尝试获取 io:format/1 的输出结果。

我知道在io_lib中有一个类似的函数,io_lib:format/2,但是输出不同。事实上,它根本没有做任何事情。 如果我尝试绑定 io:format,ok 是有界的,格式化的字符串会被写入控制台。

所以我的问题是,如何使用 io_lib:format/2 获得相同的输出? 或者如何将格式化字符串绑定到变量?

1> A = io:get_line('> ').
> "test".
"\"test\".\n"
2> io:format(A).
"test".
ok
3> B = io_lib:format(A, []).
"\"test\".\n"
4> B.
"\"test\".\n"
5> C = io:format(A).
"test".
ok
6> C.
ok

【问题讨论】:

    标签: erlang


    【解决方案1】:

    io_lib:format 不像io:format 那样是一个输出函数。而io_lib:format 只返回值,不输出。

    io:format 的结果,您将其视为“测试”。是发送到终端的渲染版本(包括换行符),然后返回ok。相反,io_lib:format 的返回值,您看到的 "\"test\".\n" 只是 erlang shell 对同一字符串的表示,引号和换行符被转义,并被自己的引号包围。

    io_lib:format 更常用于向字符串中插入值(类似于 C 的 printf 函数)。例如,做类似

    NewString = io_lib:format("The string entered was ~s I hope you like it",[A])
    

    NewString 的值为

    The string entered was "test".
    I hope you like it
    

    Erlang Shell 的表现形式是:

    "The string entered was \"test\".\n I hope you like it"
    

    如果你只想输出刚刚输入的值,那么io:format就足够满足你的需要了。

    【讨论】:

    • 谢谢,但是如何在变量中获得与 io:format 相同的结果?我知道使用 io:read 会更容易,但我必须使用 get_line。
    • io_lib:format 确实返回与发送到 io:format 的结果相同的结果。您所看到的只是 Erlang shell 对字符串的表示。 `"test". 看起来很奇怪,但这只是因为它正在转义字符串,并向您显示正在使用的转义符。
    • 问题是我无法将变量绑定到 io:format,因为返回值 ok 是有界的,并且格式化的字符串只是简单地写出到控制台。有没有一种简单的方法来摆脱换行符,就像 io:format 一样,或者以某种方式绑定写出的字符串?
    • io:format doesn't 实际上摆脱了换行符,它像换行符一样将光标移动到下一行,即“ok”在下一行。例如,如果你刚刚执行了 io:format("1234"),你会看到1234ok 打印在行上。
    • 如果你只是想删除任何尾随的换行符,你可以做一些事情 string:strip(A,right,10). 10 是换行的 ASCII 数字。这只是意味着“如果字符串末尾有任何换行符,请将它们全部删除”
    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多