在Elixir repl,iex中,当我执行赋值时,我得到以黄色打印的模式匹配结果:
在模式匹配很长之前这很好,例如文件:
...显然如果它是一个大文件,它a)需要永远(不是因为阅读时间,而是准备打印模式匹配到屏幕),然后b)它滚动了很长时间。
如何抑制此行为,或限制模式匹配输出的大小?
答案 0 :(得分:8)
我只是在表达式的末尾添加另一个语句(iex
是一个很好的短语),这使得iex(1)> a = Enum.to_list(1..100); 0
0
iex(2)> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50, ...]
不打印第一个表达式的输出,只打印最后一个:
onClick
答案 1 :(得分:2)
默认情况下,Elixir REPL限制要打印的输出的长度:
iex(16)> Enum.to_list(1..100)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, ...]
您可以使用Kernel.inspect/2
选项使用:limit
功能来更改它。例如,Kernel.inspect Enum.to_list(1..100), limit: :infinity
将打印整个列表。
但是,:limit
选项不适用于字符串,也不适用于字符串,File.read/1
返回字符串(UTF-8编码的二进制文件)。但是你仍然可以通过告诉inspect/2
将字符串视为正常的字节序列(只是二进制)来限制打印输出:
Kernel.inspect File.read!("a.txt"), limit: 60, binaries: :as_binaries
要对文件的每一行执行操作,您可以在Stream上使用Enum.each/2
并传递相应的函数:
File.stream!("a.txt") |> Enum.each fn line -> IO.puts line end
此代码只会打印每一行。
答案 2 :(得分:1)
虽然@dogbert的答案是最简单的解决方案,但是还有另一种有趣的方式来抑制IEx
本身提供的IEx输出。只需在最后调用此函数:
IEx.dont_display_result
因此,您可以在IEx中执行此操作:
f = File.read!(my_large_file); IEx.dont_display_result