Erlang 将字符串转换为另一种格式
我想将二进制字符串Erlang 将字符串转换为另一种格式,erlang,Erlang,我想将二进制字符串转换为以下字符串“”。 换句话说,每个字节应在一个“小于”字符和一个“大于”字符之间写入 我想这个函数是递归的?请注意,abc只是一个例子 1>列表:展平([[$]| | C[$]end,binary_to_list())。 1>lists:flatten([[$<,C,$>]||C<-binary_to_list(<<"abc">>)]). "<a><b><c>" 或 f(C)->[$]。
转换为以下字符串“
”。
换句话说,每个字节应在一个“小于”字符和一个“大于”字符之间写入
我想这个函数是递归的?请注意,abc只是一个例子 1>列表:展平([[$]| | C[$]end,binary_to_list())。
1>lists:flatten([[$<,C,$>]||C<-binary_to_list(<<"abc">>)]).
"<a><b><c>"
或
f(C)->[$]。
列表:flatmap(有趣的f/1,二进制的列表()。
使用二进制理解:
2> [[$<, C, $>] || <<C:1/binary>> <= <<"abc">>].
[[60,<<"a">>,62],[60,<<"b">>,62],[60,<<"c">>,62]]
2>[[$]| |就效率而言,这个答案可能不是最好的(我没有将它与其他解决方案进行比较),但它确实有助于理解如何在erlang中的不同集合上发明自己的迭代器,以实现特定目标,而不是使用预定义的迭代器
fr(<<>>, Output) -> Output;
fr(<<"b", Rest/binary>>, Output) ->
fr(Rest, <<Output, "b">>);
fr(<<C:8, Rest/binary>>, Output) ->
fr(Rest, <<Output/binary, $<, C:8, $>>>).
f(Input) -> fr(Input, <<>>).
fr(,输出)->输出;
fr(,输出)->
fr(其余,);
fr(,输出)->
fr(其余,)。
f(输入)->fr(输入,)。
另外,看起来这个解决方案实际上是最有效的:)如果你想要一个简单的列表,最有效的可能是:
fr(<<C,Rest/binary>>) ->
[$<,C,$>|fr(Rest)];
fr(<<>>) -> [].
fr()->
[$| fr(剩余)];
fr()->[]。
此扩展类似于列表/二进制理解扩展到的内容。如果您编写所需的示例输出,这将非常有用。哦!是否可以将函数添加到flatten中。例如,如果C为b,则不将<和>?好的,不将其放入列表:Flatte/1中,因为它只接受一个参数,即列表。列表:fla另一方面,tmap/2。请参见编辑。foreach(乐趣,列表)不可能吗?我不理解扁平化的概念…参考资料可以在erlang.org或上找到。学习一些基本知识可能是一本不错的读物。接受最能帮助你理解问题的帖子也总是很感激的。:)如果性能很重要,如果结果会通过套接字或文件发送,这是一个很好的解决方案为什么要构建新的单字节二进制文件| |你没有将它与其他解决方案进行比较吗?你应该这样做!我打赌你用HiPE编译的代码在当前可用的其他答案中会比任何解决方案都好。可能是,我仍然更愿意指出代码尾递归背后的思想,以及它在设计复杂高效迭代器中的用途。我可以想象在tail-call参数比许多其他解决方案快一点点。
fr(<<>>, Output) -> Output;
fr(<<"b", Rest/binary>>, Output) ->
fr(Rest, <<Output, "b">>);
fr(<<C:8, Rest/binary>>, Output) ->
fr(Rest, <<Output/binary, $<, C:8, $>>>).
f(Input) -> fr(Input, <<>>).
fr(<<C,Rest/binary>>) ->
[$<,C,$>|fr(Rest)];
fr(<<>>) -> [].