2017-10-06 3 views
0

Ich habe jetzt ein Problem für Stunden zu beheben versucht, sehr neu erlangErlang Druck hex statt integer

lists:sublist([6,9,15,24,39,6,96],7,1). 

Ich will die „100“ anstelle von „d“

drucken, was Ich mache ich hier falsch?

+0

Das ist nicht Hex, es ist ASCII. – tadman

+0

Der aktuelle Wert ist nicht ASCII "d".Sie haben einen Backtick im Moment (char Wert 96) ... – zxq9

Antwort

6

Die Shell wird versuchen, Zeichenfolgen als Zeichenfolgen zu drucken, wann immer es zulässig wäre. Das bedeutet, dass Listen von ganzen Zahlen, die alles sein gültiges Zeichen passieren wird als Zeichen gedruckt werden, und Listen, die anderen Dinge enthalten als Listen gedruckt werden:

1> [65,66,67]. 
"ABC" 
2> [3,65,66,67]. 
[3,65,66,67] 

Aber Hinweis, dass ich eigentlich keine Ausgabe nennen Funktionen. Das war nur die bequeme Operation der Shell, um implizit zu reproduzieren, was auch immer ein zurückgegebener Wert war, damit Sie als Programmierer ihn überprüfen können.

Wenn ich will, eine Ausgabefunktion explizit nennen ich ein Format-String verwendet werden soll, die die Art des Wertes angibt interpoliert werden:

3> io:format("This is a list: ~tw~n", [List]). 
This is a list: [65,66,67] 
ok 
4> io:format("This is a list rendered as an implied string: ~tp~n", [List]). 
This is a list rendered as an implied string: "ABC" 
ok 
5> io:format("This is a string: ~ts~n", [List]).        
This is a string: ABC 
ok 

Hinweis des zusätzliche Atom ok nach jedem Druck. Dies liegt daran, dass der Rückgabewert von io:format/2ok ist. Wir erhalten also die explizite Ausgabe von format/2 und sehen dann ihren Rückgabewert.

Das IO-Modul doc Seite hat die gritty Details: http://erlang.org/doc/man/io.html#format-1

Zurück zu Ihrem Beispiel ...

6> lists:sublist([6,9,15,24,39,6,96],7,1). 
"`" 
7> io:format("~tw~n", [lists:sublist([6,9,15,24,39,6,96],7,1)]). 
[96] 
ok 

Nachtrag

Es gibt eine Einstellung shell:strings/1 genannt, die die Schale erzählt um die Formatierung der Zeichenfolge ein- und auszuschalten:

1> [65,66,67]. 
"ABC" 
2> shell:strings(false). 
true 
3> [65,66,67]. 
[65,66,67] 
4> <<65,66,67>>. 
<<65,66,67>> 
5> shell:strings(true). 
false 
6> <<65,66,67>>.  
<<"ABC">> 

Aber ich verwirren sie nicht mit dieser Einstellung immer mehr für ein paar Gründe:

  • Es ist so gut wie nie die Mühe wert dieses Detail der Schale (Bequemlichkeit Ausgabe der Shell zu erinnern ist, vor allem nützlich für die Entdeckung zurück Wertstrukturen, nicht bestimmte Werte von diesen Strukturen gehalten - und wenn Sie diese Daten möchten Sie in der Regel Strings als Strings trotzdem gedruckt werden).
  • Es kann auf jeden Fall überraschend Shell-Ausgabe verursachen, wo Sie wirklich Umgang mit Strings sind.
  • Das ist fast nie das Verhalten, das Sie eigentlich wollen.
  • Im Umgang mit realen Programmen benötigen Sie tatsächliche Ausgabefunktionen mit io oder io_lib Module, und die Entwicklung von Gewohnheiten rund um Formatzeichenfolgen ist viel nützlicher als Sorgen über Komfort Ausgabe von der Shell.
+1

Ich denke, kann einige Informationen über die Funktion 'shell: strings/1' hinzufügen. –

+0

@Atomic_alarm Danke für die Erinnerung. Ich habe eine Notiz über 'shell: strings/1' hinzugefügt. Die Hauptsache, die ich ausdrücken wollte, war die allgemeine Methode der Verwendung von Formatzeichenfolgen, da sie für immer universell verwendbar ist, während Shell Convenience-Werte im Allgemeinen nur gelegentlich verwendet werden, wenn mit einer Idee gespielt wird. – zxq9

Verwandte Themen