2009-10-09 23 views
5

Gibt es eine Entsprechung zu Perls """ in Erlang?Zeichenkette, die in Erlang begrenzt

Ich möchte in der Lage sein, eine ziemlich lange Zeichenfolge voller Anführungszeichen zu definieren, ohne jeden einzelnen zu entkommen. Ist das möglich?

Fühlen Sie sich frei, mich wissen zu lassen, wenn ich bin Doing It Wrong.

Danke!

+1

Flucht ist wahrscheinlich sicherer, wenn es für den Programmierer, der nach Ihnen kommt, einfacher zu verstehen ist. –

Antwort

3

Nr

Es gibt im Grunde keine andere Möglichkeit, es zu tun. Die hier vorgestellten Vorschläge funktionieren, scheinen aber komplexer als die direkte Lösung und weniger klar.

+0

Vielen Dank Ich muss zugeben, dass alle bisherigen Lösungen die Dinge komplizierter machen. –

1

Ich glaube, deine beste Wahl besteht darin, deine mehrzeilige, doppelreihige Zeichenfolge in eine separate Datei zu schreiben und sie dann mit der neuen Datei zu lesen: read_line, die Zeilen beim Hochfahren deiner App verkettet.

Oder wenn Sie eine über-Chaos haben möchten, können Sie dies mit Parse-Transformationen kombinieren. Sie können Ihre Zeichenfolge (n) in den Quellcode einfügen, auskommentiert und wenn die Parse-Transformation aufgerufen wird, öffnen Sie die Quelldatei, lesen den Text aus den Kommentaren aus, verketten und ersetzen. Beispiel:

... 
Len = erlang:length("MY_FAKE_STRING_13"), 
%% This is my "double-qouted" 
%% "multi-line" string; 
%% you know what I mean ;) 

... 

In Ihrer Syntaxtransformation suchen Sie nach Strings, die mit MY_FAKE_STRING beginnen. Wenn Sie einen finden, öffnen Sie den Quellcode Ihres Moduls und lesen Zeilen, bis Sie die gleiche Zeichenfolge erreichen. Lies dann deine Quelle Zeile für Zeile, bis Kommentare kommen, und verkette sie. Wenn Sie die erste leere (oder nichtkommentare) Zeile erreichen, haben Sie Ihre Zeichenfolge, die Sie anstelle der falschen Zeichenfolge zurückgeben können.

+1

Bitte verwenden Sie dafür keine Parse Transformationen. Abgesehen davon, dass sie den Code völlig unlesbar machen, sind sie auch sehr nicht trivial. Es macht zehnmal mehr Sinn, externe Textdateien in diesem Fall zu verwenden. –

+0

Ich würde zustimmen, aber der Nachteil der externen Datei ist, dass Sie Ihren Code ändern müssen, um die Datei nur einmal zu lesen. Versuchen Sie zum Beispiel, httpd_utils: reason_phrase() neu zu schreiben, um externe Dateien zu verwenden. Auch Code-Upgrade wird nicht-trivial, weil Sie ein erneutes Lesen der externen Datei aufrufen müssen, wenn Sie den Text usw. ändern möchten. – Zed

+0

Diese Lösung ist viel zu komplex. – Christian

3

Wie wäre es damit:

1> atom_to_list('He said "hello" and then she answered "hi".'). 
"He said \"hello\" and then she answered \"hi\"." 

Sie ein Makro atom_to_list für eine verbesserte Lesbarkeit abzukürzen definieren.

+1

Dies hat den gleichen Nachteil wie die externe Datei Lösung. Sie ändern entweder Ihren Code, um die Konvertierung einmal durchzuführen (es sei denn die konstante Atom-zu-Liste-Konvertierung ist akzeptabel). Auch auf diese Weise Newline-Zeichen in Ihrem String werden vom Betriebssystem abhängig, so dass Sie Probleme mit Erlangs haben, die auf verschiedenen Betriebssystemen laufen, die miteinander reden – Zed

1

Speichern Sie Ihren Text in separate Datei

2

Zuerst möchte ich sagen, dass eine solche Zeichenfolge Zitat aufweist, ist keine schlechte Idee für zukünftige Versionen von Erlang. Aber ich halte meinen Atem nicht an, damit er ankommt. Python nutzt sie als "unmunged" mehrzeilige Doc-Strings.

Wenn ich genügend genervt war, indem ich Zitate und Backslashes umgehen musste, würde ich in der Ausarbeitung eines transformierenden Makros in meinem Editor suchen, um es für mich auf der aktuellen Textauswahl zu tun. Oder vielleicht einfach mit einem Regexp in sed zu cut'n'paste implementieren. :)

$ echo 'Testing a "robust" way to \quote\ things.' | sed -e 's/[\\"]/\\&/g' 
Testing a \"robust\" way to \\quote\\ things.