2011-11-07 58 views
10

在Erlang中,当您有可打印字符列表时,它是一个字符串,但字符串也是一列项目,列表的所有函数都可以应用到字符串上。理想情况下,erlang中不存在数据结构:字符串。

我的代码的一部分需要确定的东西不仅是一个列表,但它的一个字符串。 (一个真正的字符串)。它需要分开列表,例如[1,2,3,a,b,"josh"],来自字符串例如"Muzaaya"。对于字符串和列表,警卫表达式is_list/1将会说true。没有像 is_string/1 这样的警卫,所以这意味着我需要一个代码片段来确保我的数据是一个字符串。在这种情况下的字符串是仅可打印的列表(按字母顺序,两种情况,上和下),并且可以包含数字,例如"Muzaaya2536 618 Joshua"。我需要一个代码片段(Erlang)来检查我并确保变量是一个字符串,而不仅仅是一个列表。感谢从Erlang列表中区分字符串

+0

参见http://stackoverflow.com/questions/2479713/determining-if-an-item-is-a-string-or-a-list-in-erlang – legoscia

回答

5

使用的可打印字符的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. 

你将不能够使用它作为一个后卫,虽然。

+0

谢谢@ butter71,这个工作也很好! –

+0

这适用于Latin1字符集,但注意它会拒绝Unicode字符代码可能很重要。 – goncalotomas