2009-10-09 11 views
5

Czy w mieście Erlang istnieje odpowiednik Perla """?Wyznaczanie ciągów w Erlang

Chciałbym móc zdefiniować dość długi ciąg pełen podwójnych cytatów bez ucieczki od każdego. Czy to jest możliwe?

Jeśli chcesz wiedzieć, zadzwoń pod numer , robiąc to źle.

Dzięki!

+1

Ucieczka jest prawdopodobnie bezpieczniejsza, jeśli nie z innego powodu, niż będzie to łatwiejsze do zrozumienia dla programisty, który przyjdzie po ciebie. –

Odpowiedz

3

nr

Jest to w zasadzie żaden inny sposób to zrobić. Przedstawione tu sugestie działają, ale wydają się bardziej złożone niż proste rozwiązanie i mniej jasne.

+0

Dziękuję. muszę się zgodzić, że wszystkie rozwiązania dotychczas tylko uczynić to bardziej skomplikowane. –

1

Uważam, że najlepszym wyborem jest umieszczenie wieloliniowego ciągów pełnotekstowych w osobnym pliku, a następnie odczytanie go za pomocą nowego pliku: read_line, łączenie linii podczas uruchamiania aplikacji.

Lub jeśli chcesz mieć über-bałagan, możesz połączyć to z przekształceniami parse. Możesz umieścić swój ciąg (y) w kodzie źródłowym, skomentować i po wywołaniu transformacji parsowania otworzyć plik źródłowy, odczytać tekst z komentarzy, połączyć i zastąpić. Przykład:

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

... 

W swojej parse przekształcić szukać ciągi zaczynające się MY_FAKE_STRING. Kiedy znajdziesz taki, otwórz kod źródłowy twojego modułu i czytaj wiersz, aż dotrzesz do tego samego ciągu. Następnie czytaj swoje źródło line-by-line, aż pojawią się komentarze i połącz je. Sięgając do pierwszej pustej (lub nie komentującej) linii, masz swój ciąg znaków, który możesz zwrócić zamiast fałszywego ciągu.

+1

Proszę, nie używajcie do tego transformacji parse. Oprócz tego, że kod jest całkowicie nieczytelny, są one również bardzo niebanalne. W tym przypadku dziesięć razy bardziej sensowne jest używanie zewnętrznych plików tekstowych. –

+0

Zgadzam się, ale wadą zewnętrznego pliku jest to, że musisz zmodyfikować swój kod, aby odczytać plik tylko raz. Na przykład spróbuj przepisać httpd_utils: reason_phrase(), aby użyć plików zewnętrznych. Również uaktualnienie kodu staje się nietrywialne, ponieważ konieczne jest wywołanie ponownego odczytania pliku zewnętrznego, jeśli chcesz zmienić tekst, itd. – Zed

+0

To rozwiązanie jest zbyt skomplikowane. – Christian

3

Jak o tym:

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

Można zdefiniować makro skrót atom_to_list dla lepszej czytelności.

+1

ten ma taką samą wadę jak zewnętrznym roztworze plików. Trzeba albo zmodyfikować kod, aby wykonać konwersję raz (chyba że stały atom do listy konwersji jest dopuszczalne). również w ten sposób znaki nowej linii w swojej ciąg stać OS zależne, więc można napotkać problemy z Erlangs działa na różnych systemach operacyjnych rozmawiają ze sobą. – Zed

2

Pierwszy Chciałbym powiedzieć, że mając taki cytat ciąg nie jest to zły pomysł dla przyszłych wersjach Erlang. Ale nie wstrzymuję oddechu, żeby to nadejść. Python dobrze wykorzystuje je jako "niezmienione" wieloliniowe dokumenty doc.

Gdybym był wystarczająco zirytowany przez konieczność ucieczki od wycinków i odwrotnych ukośników, zajrzałbym do opracowania transformującego makra w moim edytorze, aby zrobić to dla mnie przy aktualnym zaznaczeniu tekstu. A może po prostu zaimplementowanie go z wyrażeniem regularnym w sed do cut'n'paste. :)

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