2011-11-07 3 views
10

Erlangでは、印刷可能な文字のリスト、その文字列がある場合は文字列ですが、文字列も項目のリストであり、リストのすべての機能を文字列に適用できます。理想的には、データ構造体:stringは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に2つの機能があります。引数はそれぞれ印刷可能latin1のまたはユニコード文字のリストである場合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文字セットで機能しますが、Unicode文字コードを拒否することに注意することが重要です。 – goncalotomas

関連する問題