erlang中的字符串值

Posted

技术标签:

【中文标题】erlang中的字符串值【英文标题】:string value in erlang 【发布时间】:2014-08-28 16:53:44 【问题描述】:

我是 erlang 的新手。我必须维护和实现一个用 erlang 构建的后端项目的新功能。我在 c/c++、php、ruby、python 和 javascript 方面有很强的背景。我在实现从电话号码列表中删除某些前缀的功能时遇到问题

-module(reminder_group).
-export([address_with_no_prefix/1]).

-define(PREFIXES, [
    '855', 
    '+855', 
    '0', 
    '+0', 
    '+'
 ]).

address_with_no_prefix(Address) ->
  address_with_no_prefix(Address, ?PREFIXES).

address_with_no_prefix(Address, []) -> Address;

address_with_no_prefix(Address, Prefixes) ->
  [Prefix|H] =  Prefixes,
  Length = string:len(Prefix),
  AddressPrefix = string:substr(Address, 1, Length),

  if 
   Prefix == AddressPrefix -> 
     string:substr(Address, Length);
   true ->  
     address_with_no_prefix(Address, H)
end.

编译后运行

reminder_group:address_with_no_prefix("0123445")

我收到以下错误:

1> reminder_group:address_with_no_prefix("0123445").
 ** exception error: bad argument
    in function  length/1
    called as length('855')
    in call from string:len/1 (string.erl, line 66)
    in call from reminder_group:address_with_no_prefix/2 (src/models/reminder_group.erl, line 34)

这似乎是 Length = string:len(Prefix) 的问题,但是我测试运行

string:len("855"). 

它与 3 的结果一起工作正常。我的字符串值列表有什么问题吗? 请帮忙。

【问题讨论】:

【参考方案1】:

您使用单引号(而不是双引号)来表示您的前缀。我假设您的意思是这些是字符串,而不是原子(因此应用string:len)?

您的测试成功了,因为您正确地使用了双引号来构造字符串文字。

【讨论】:

感谢@Gian 指出这一点并给出很好的解释。我有点困惑。

以上是关于erlang中的字符串值的主要内容,如果未能解决你的问题,请参考以下文章

Erlang - **异常错误:右侧值不匹配

为什么在erlang中对此字符串进行模式匹配会导致尾部的“字符串”和列表的ascii值?

模式匹配 Erlang 字符串作为函数中的列表

如何从erlang中的字符串中删除符号

Erlang中模式匹配字符串的正确方法

如何在 Erlang 中找到 utf8 编码二进制文件的字符长度?