gpt4 book ai didi

Erlang 代码将不带分隔符的字符串拆分并放入列表

转载 作者:行者123 更新时间:2023-12-01 09:44:44 29 4
gpt4 key购买 nike

我对 Erlang 编程非常陌生。我正在制作一个解码盲文的程序,但我在尝试在没有分隔符的情况下每 2 个字符拆分一个字符串并将它们放入列表时遇到问题。

首先我读的是这样的盲文字母:

inKey(Key1) -> Key1.
inKey2(Key2) -> Key2.
inKey3(Key3) -> Key3.

键 1-3 是字符串,如下所示:"x.x.xxxxx.xxxxx..x.xx.x.xxxxx.xxxxx..x.xx.x..xxxxxx." 这些3 个键构成盲文信息,我稍后将使用这些信息将盲文转换为普通字符。

现在我需要拆分这个字符串并将它们放在一个列表中,使其看起来像这样:["x.","x.","xx","xx",x.", "xx","xx","x.",".x 等等。

如果字符串被拆分,我想将它们插入到我的编码列表中,如字符 A 的连音中所示

 Code=[#row{name="R1",alfabet=[#codes{letter="A",braille="X."},#codes{letter="B",braille=""}

有人可以帮帮我吗?

`

最佳答案

在 Erlang 中,你需要记住一个字符串相当于一个数字列表,其中的数字是每个字符的 ascii 代码。令人困惑的是,有时 shell 将数字列表显示为字符串,有时将数字列表显示为数字列表。这是 erlang shell 的一个可怕特性。

不管 shell 显示什么,只要记住字符串是一个数字列表。那么问题就变成了,如果你想输出一个数字列表而不是一个字符串怎么办?答案是:你对此无能为力;外壳可能会将您的数字列表显示为字符串...除非您采取进一步措施:

45> Grades = [97,98,99].
"abc"

Wtf??!

46> io:format("~w~n", [Grades]).
[97,98,99]
ok

另一种思考方式是:erlang 字符串语法 "abc" 只是创建数字列表的快捷方式 [97,98,99] .

接下来,您可以使用如下模式解构列表:

[Head|Tail] = [1,2,3]

在外壳中:

8> [Head|Tail] = [1, 2, 3, 4].
[1,2,3,4]

9> Head.
1

10> Tail.
[2,3,4]

但是,cons 运算符 | 比这更灵活,它允许你这样做:

13> [N1,N2 | T] = [1, 2, 3, 4].   
[1,2,3,4]

14> N1.
1

15> N2.
2

16> T.
[3,4]

因此,您可以这样做:

-module(my).
-compile(export_all).

string() ->
"x.x.xxxxx.xxxxx..x.xx.x.xxxxx.xxxxx..x.xx.x..xxxxxx.".

chunk2([]) -> [];
chunk2([N1, N2| Tail]) ->
[[N1,N2] | chunk2(Tail) ].

在外壳中:

2> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

3> my:chunk2(my:string()).
["x.","x.","xx","xx","x.","xx","xx","x.",".x",".x","x.",
"x.","xx","xx","x.","xx","xx","x.",".x",".x","x.","x.",".x",
"xx","xx","x."]

4>

最后,要构造一个#code{}记录列表,你可以这样做:

-module(my).
-compile(export_all).
-record(codes, {letter, braille}).

string() ->
"x.x.xxxxx.xxxxx..x.xx.x.xxxxx.xxxxx..x.xx.x..xxxxxx.".

chunk2([]) -> [];
chunk2([N1, N2| Tail]) ->
[[N1,N2] | chunk2(Tail) ].

make_record_list(Letters, Chunks) ->
lists:zipwith(
fun(Letter, Chunk) -> #codes{letter=[Letter], braille=Chunk} end,
Letters,
Chunks
).

在外壳中:

31> c(my).             
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

32> ListOfCapLetters = lists:seq($A, $Z).
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

33> BrailleChunks = my:chunk2(my:string()).
["x.","x.","xx","xx","x.","xx","xx","x.",".x",".x","x.",
"x.","xx","xx","x.","xx","xx","x.",".x",".x","x.","x.",".x",
"xx","xx","x."]

34> Records = my:make_record_list(ListOfCapLetters, BrailleChunks).
[{codes,"A","x."},
{codes,"B","x."},
{codes,"C","xx"},
{codes,"D","xx"},
{codes,"E","x."},
{codes,"F","xx"},
{codes,"G","xx"},
{codes,"H","x."},
{codes,"I",".x"},
{codes,"J",".x"},
{codes,"K","x."},
{codes,"L","x."},
{codes,"M","xx"},
{codes,"N","xx"},
{codes,"O","x."},
{codes,"P","xx"},
{codes,"Q","xx"},
{codes,"R","x."},
{codes,"S",".x"},
{codes,"T",".x"},
{codes,"U","x."},
{codes,"V","x."},
{codes,"W",".x"},
{codes,"X","xx"},
{codes,"Y","xx"},
{codes,"Z",[...]}]

看来最后一条记录可能有问题,我们检查一下:

37> tl(Records).  
[{codes,"B","x."},
{codes,"C","xx"},
{codes,"D","xx"},
{codes,"E","x."},
{codes,"F","xx"},
{codes,"G","xx"},
{codes,"H","x."},
{codes,"I",".x"},
{codes,"J",".x"},
{codes,"K","x."},
{codes,"L","x."},
{codes,"M","xx"},
{codes,"N","xx"},
{codes,"O","x."},
{codes,"P","xx"},
{codes,"Q","xx"},
{codes,"R","x."},
{codes,"S",".x"},
{codes,"T",".x"},
{codes,"U","x."},
{codes,"V","x."},
{codes,"W",".x"},
{codes,"X","xx"},
{codes,"Y","xx"},
{codes,"Z","x."}]

不,第一个输出刚刚达到 shell 愿意显示的限制。

注意,ListOfCapLetters 的每个元素都是一个数字,而一个数字又不是一个列表,所以 ListOfCapLetters 的每个元素本身都不是一个字符串。要从数字创建字符串,您需要将其放入列表中,因此是 [Letter]String = [97,98,99]ListOfStrings = [[97], [98], [99]] 之间的区别相同:

40> String = [97,98,99].
"abc"

41> hd(String).
97

42> ListOfStrings = [[97], [98], [99]].
["a","b","c"]

43> hd(ListOfStrings).
"a"

lists:seq() 返回 String 的等价物。

对评论的回应:

lists:keyfind/3 :

20> TargetRecord = lists:keyfind("xx", 3, Records).                
#codes{letter = "C",braille = "xx"}

21> rr(my). %Read record definition contained in my.erl into the shell.
[codes]

22> TargetRecord#codes.letter.
"C"

字符串 "C" 实际上是列表 [67],shell 决定将其显示为 "C"。你需要能够查找一个 ascii 表来发现一个字符串在 Erlang 中真正代表什么。或者,您可以像这样获取字符的 ascii 代码:

24> $C.
67

25> $a.
97

所以,"C"其实就是列表[67]"a"其实就是列表[97]。

关于Erlang 代码将不带分隔符的字符串拆分并放入列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51687253/

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