Erlang シェルは、指定されたリストが印刷可能な文字列であるかどうかを「推測」し、便宜上そのように印刷します。この「便利さ」を無効にすることはできますか?
7 に答える
シェルのデフォルトの動作を変更できるかどうかはわかりませんが、少なくとも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()
、すべてをうまくフォーマットするようなものを書くことも検討する必要があります。
私はシェルのリストにアトムを追加することでそれを行う傾向があります。
例えば:
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()] は、「ほとんどの場合、正しいもの (ish)」を出力します。
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]}
いいえ、無効にする方法はありません。私が見つけた最良の代替手段は、クエリの値を明示的に出力するか ( を使用io:format
)、または do: の後に実行することですio:format("~w\n", [v(-1)])
。
防ぐことはできないと思います。アトムを前に付けるのは面倒くさいようです-元の文字列を変更します。
私は通常、lists:flatten(String) を使用して強制的に文字列にします。特に、io_lib:format() の戻り値は常に文字列として出力されるとは限りません。それに lists:flatten() を使用すると、1 つになります。
次の「Cスタイル」を使用します。
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
問題は、文字列が Erlang の型ではないことです。文字列は単なる整数のリストであるため、シェルが印刷可能な文字列と一般的なリストを区別する方法はありません。これがあなたの質問に対する答えかどうかわかりません。