2011-11-07 3 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

답변

23

당신은 도움이 될 수있는 모듈 io_lib의 두 가지 기능을 가지고 : io_lib:printable_list/1io_lib:printable_unicode_list/1하는 테스트 인수가 문자를 각각 인쇄 라틴 또는 유니 코드의 목록입니다 경우.

+1

감사합니다. @rvirding, 이것은 더 표준적인 해결책입니다! –

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

thanks @ butter71, 이것도 아주 잘 작동합니다 ! –

+0

Latin1 문자 집합에 대해 작동하지만 유니 코드 문자 코드를 거부한다는 점에 유의해야합니다. – goncalotomas