Wie kann ich feststellen, ob eine Liste ist eine nur eine Zeichenfolge oder eine Liste von Strings?
-
05-07-2019 - |
Frage
Ich habe eine Variable, die entweder eine Liste von Strings oder nur einen String enthalten können. Gibt es ein guter Weg, zu sagen, welche Art ich bin den Umgang mit?
"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"]
In jedem Fall möchte ich beteiligt die Bits verwenden.
Lösung
Wie Sie tun es viel hängt davon ab, was Sie vorhaben, mit dem Ergebnis zu tun, oder vielmehr, wie man es tun planen. Also, wenn Sie daran interessiert sind in den Bits:
case MyVar of
[First|Rest] when is_list(First) -> ... First,Rest ...;
_ -> ... MyVar ...
end
oder wenn Sie nicht daran interessiert sind, ziehen auseinander tatsächlich die Zeichenfolge / Liste von Strings, die Sie tun können:
if is_list(hd(MyVar)) -> ... ;
true -> ...
end
Habe ich Sie richtig verstanden hier? Ich habe keinen Code in setzen, um tatsächlich zu prüfen, was eigentlich sein sollte Strings Strings sind, sollte dies früher getan haben werden. Eine Alternative wäre, wenn diese Zeichenfolge / Liste von Zeichenketten zu erzeugen immer es in einem der Formate zu setzen.
Andere Tipps
ich manchmal etwas schreiben wie:
case X of
[List|_] when is_list(List) ->
list_of_lists;
List when is_list(List) ->
list;
_ ->
not_a_list
end
Erlang implementiert verschiedene Funktionen zu testen, ob eine Liste eine flache Liste in Modul io_lib ist.
Eine gute Wahl, um Ihre besonders IP-Strings für die Überprüfung ist io_lib: latin1_char_list (Term) http://erlang.org/doc/man/io_lib.html#latin1_char_list- 1
io_lib: latin1_char_list / 1 Funktion Implementierung ist:
latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 ->
latin1_char_list(Cs);
latin1_char_list([]) -> true;
latin1_char_list(_) -> false.
Wenn Sie möchten, für flache Unicode-Listen testen, die Sie verwenden können io_lib: char_list (Term) http://erlang.org/doc/man/io_lib.html#char_list- 1
io_lib: char_list / 1 Funktion Implementierung ist:
char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800;
is_integer(C), C > 16#DFFF, C < 16#FFFE;
is_integer(C), C > 16#FFFF, C =< 16#10FFFF ->
char_list(Cs);
char_list([]) -> true;
char_list(_) -> false.
Überprüfen Sie die io_lib Modul Dokumentation für andere ähnliche Funktionen.
Beachten Sie, dass , wenn einige neue erlang Funktion von Ihrem aktuellen Projekt unterstützt erlang Version fehlen Sie einfach die Implementierung neuer erlang Versionen bietet kopieren und sie in ein Modul der eigenen hinzufügen. Suchen Sie die neueste erlang / lib / * / src Quellcode und einfach erhalten Sie die neuen Funktionen, die Sie benötigen.