我正在编写一个程序,我在其中处理表格中的字符串,例如"\001SOURCE\001"
。也就是说,字符串包含字母数字文本,每端的ASCII字符值为1。我正在尝试编写一个函数来匹配这些字符串。我尝过这样的比赛:
handle(<<1,"SOURCE",1>>) -> ok.
但比赛没有成功。我已尝试过这个主题的一些变化,但都失败了。
有没有办法匹配一个主要包含字母数字文本的字符串,但每端的非字母字符除外?
答案 0 :(得分:2)
字符串是列表的语法糖。列表是一种类型,二进制文件是一种不同的类型,因此您的匹配功能尚未确定,因为您尝试将列表与二进制文件匹配(如果您尝试将{1, "STRING", 1}
与其匹配,则会出现同样的问题,元组不列出。)
记住字符串是列表,我们有几个选项:
handle([1,83,84,82,73,78,71,1]) -> ok.
这样可以正常工作。另一种更易读(但更丑陋)的方法是使用字符文字:
handle([1, $S,$T,$R,$I,$N,$G, 1]) -> ok.
另一种方法是剥离非字符值,然后将其传递给处理程序:
handle(String) -> dispatch(string:strip(String, both, 1)).
dispatch("STRING") -> do_stuff();
dispatch("OTHER") -> do_other_stuff().
而且,如果可能的话,最好的情况是你完全停止使用字符串作为文本值(如果可行)并直接处理二进制文件。二进制文件的语法非常友好,它们占用的资源更少,而且相当多的二进制操作比字符串/列表操作更有效。但这并不适合每一个案例! (但在处理套接字时它很棒......)
答案 1 :(得分:2)
您还可以执行以下操作
[1] ++ "SOURCE" ++ [1] == "\001SOURCE\001".
或使用list_to_binary转换为二进制,并将模式匹配转换为
<<1,"SOURCE",1>> == <<"\001SOURCE\001">>.