Могу ли я отключить печать списков небольших целых чисел в виде строк в оболочке Erlang?

Оболочка Erlang "угадывает", является ли заданный список печатаемой строкой, и выводит его таким образом для удобства . Можно ли отключить это «удобство»?


person Alexey Romanov    schedule 27.02.2010    source источник


Ответы (7)


Вы можете отключить такое поведение с помощью shell:strings/1 function, начиная с Erlang R16B.

Просто помните, что это глобальная опция для всех оболочек узлов, и может быть целесообразно установить ее обратно после завершения воспроизведения оболочки в долгоживущих узлах.

person mpm    schedule 23.09.2014

Я не знаю, возможно ли изменить поведение оболочки по умолчанию, но вы можете, по крайней мере, правильно отформатировать свой вывод, используя io:format.

Вот пример:

1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok

А так как шелл предназначен только для экспериментов/сопровождения, io:format() должно быть как минимум достаточно для вашего реального приложения. Возможно, вам также следует подумать о написании собственного метода форматирования/печати, например. formatPerson() или что-то в этом роде, которое все прекрасно форматирует.

person tux21b    schedule 27.02.2010
comment
Я знаю о формате io: и, вероятно, должен был упомянуть об этом в вопросе :) - person Alexey Romanov; 27.02.2010
comment
Это именно то, что я искал, когда мне нужно было напечатать список целых чисел в виде строки. Спасибо! - person Matt; 15.09.2017

Я обычно делаю это, добавляя атом в свой список в оболочке.

Например:

Eshell V5.7.4  (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]

также может быть [a,65,66,67], конечно. но [a|fun_that_returns_a_list()] будет печатать "правильное (нужно) большую часть времени"

person David Budworth    schedule 27.02.2010

Начиная с Erlang/OTP R16B вы можете использовать функцию shell:strings/1, чтобы включить или выключить это. Обратите внимание, что это также влияет на печать вещей, которые на самом деле должны быть строками, например "foo" в следующем примере:

1> {[8,9,10], "foo"}.
{"\b\t\n","foo"}
2> shell:strings(false).
true
3> {[8,9,10], "foo"}.   
{[8,9,10],[102,111,111]}
person legoscia    schedule 23.09.2014

Нет, отключить его невозможно. Лучшая альтернатива, которую я нахожу, - это либо явно распечатать значение в запросе (с io:format), либо постфактум сделать: io:format("~w\n", [v(-1)]).

person rvirding    schedule 28.02.2010

Я не думаю, что вы можете предотвратить это. Добавление атома кажется кладжом - оно изменяет исходную строку.

Обычно я использую lists:flatten(String) для преобразования его в строку, особенно возвращаемое значение io_lib:format() не всегда печатается как строка. Использование lists:flatten() делает его одним.

Я использую следующий «C-стиль»:

sprintf(Format) ->
     sprintf(Format, []).
sprintf(Format, Args) ->
    lists:flatten(io_lib:format(Format, Args)).
person haavee    schedule 10.03.2010

Проблема в том, что строка не является типом в Erlang. Строка — это просто список целых чисел, поэтому оболочка не может отличить печатную строку от общего списка. Не знаю, если это ответ на ваш вопрос.

person Roberto Aloi    schedule 27.02.2010
comment
@Zed: я знал об этом. Но, видимо, я неправильно понял вопрос. Теперь я понял, что он пытается сделать. Спасибо. - person Roberto Aloi; 28.02.2010