【问题标题】:differentiate a string from a list in Erlang区分字符串和 Erlang 中的列表
【发布时间】:2011-12-23 10:12:00
【问题描述】:

在 Erlang 中,当您有一个可打印字符的列表时,它是一个字符串,但字符串也是一个项目列表,并且列表的所有功能都可以应用于字符串。真的,数据结构string在Erlang中是不存在的。

我的部分代码需要确保某些内容不仅是一个列表,而且是一个字符串。 (一个真正的字符串)。它需要分隔列表,例如 [1,2,3,a,b,"josh"] ,来自字符串,例如"Muzaaya".

守卫表达式is_list/1 对字符串和列表都表示true。没有像 is_string/1 这样的守卫,所以这意味着我需要一个代码 sn-p 来确保我的数据是一个字符串。

在这种情况下,字符串是仅可打印的列表(按字母顺序排列,大小写都可以),并且可能包含数字,例如 "Muzaaya2536 618 Joshua"。我需要一个代码 sn-p (Erlang),它将为我检查并确保变量是一个字符串,而不仅仅是一个列表。谢谢

【问题讨论】:

标签: erlang


【解决方案1】:

使用可打印字符的 isprint(3) 定义 --

isprint(X) when X >= 32, X < 127 -> true;
isprint(_) -> false.

is_string(List) when is_list(List) -> lists:all(fun isprint/1, List);
is_string(_) -> false.

不过,您将无法将其用作警卫。

【讨论】:

  • 这适用于 Latin1 字符集,但需要注意的是它会拒绝 Unicode 字符代码。
【解决方案2】:

io_lib 模块中有两个函数会很有帮助:io_lib:printable_list/1io_lib:printable_unicode_list/1 测试参数是可打印的 latin1unicode 列表strong> 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2017-09-20
    • 2018-08-23
    • 2021-07-03
    • 2011-04-29
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多