【问题标题】:In Elixir REPL iex, how do I suppress long pattern matching results在 Elixir REPL iex 中,如何抑制长模式匹配结果
【发布时间】:2016-08-29 14:05:04
【问题描述】:

在 Elixir repl,iex 中,当我执行分配时,我得到的模式匹配结果以黄色打印:

这很好,直到模式匹配很长,例如文件:

...显然,如果它是一个大文件,它 a) 需要很长时间(不是因为读取时间,而是准备将模式匹配打印到屏幕上),然后 b) 它会滚动很长时间。

如何抑制这种行为,或限制模式匹配输出的大小?

【问题讨论】:

  • 你可以试试File.stream!/3elixir-lang.org/docs/stable/elixir/File.html#stream!/…选项linebyte你想匹配
  • 好的,那我该如何运行整个流呢?如果我输入 f = File.stream!("msgfile.txt", [], 1) ]> Stream.run 那么它所做的就是给我:好的。
  • 您希望如何限制模式匹配输出的大小?可以举个例子吗?
  • 嗯,我有一个大文件,我想把整个东西变成一个变量。您建议使用 File.stream!但我不知道如何“运行”整个 Stream ......可以这样做吗?还是我必须使用 Enum.take?因为使用 Enum.take 我需要知道流有多长,这违背了目的。基本上我想浏览整个文件...

标签: elixir


【解决方案1】:

我只是在表达式的末尾添加另一个语句(; 0 是一个很好的简短语句),这使得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, ...]

【讨论】:

    【解决方案2】:

    Elixir REPL 如何打印您的条款

    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, ...]
    

    您可以通过使用带有:limit 选项的Kernel.inspect/2 函数来更改它。例如,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

    此代码将简单地打印每一行。

    【讨论】:

    • 非常全面,但是每次都变得非常冗长,还是我遗漏了什么?
    • 我不确定你的确切意思,但如果你问 Kernel.inspect/2 是否每次都变得非常冗长,那么答案是 no 因为你可以告诉它使用limit option 打印给定术语中的 0 个项目。但是,每次将二进制文件打印为字符串和将字符列表打印为字符列表(即显示可打印字符)时,它都会变得非常冗长。
    • 我想我要问的是这种行为是否可以成为默认行为,或者我是否每次都必须输入这个长字符串。
    • 您可以使用IEx.configure/1 为每个IEx 会话设置它,也可以通过~/.iex.exs 文件永久设置它。有关详细信息,请参阅here
    • 好的,我得到了这个工作。所以该行是 IEx.configure(inspect: [binaries: :as_binaries]) 并且从那里开始它将字符串视为二进制文件并对它们应用通常的限制。这很好用,我认为这是一个很好的解决方案,即使你有一个稍微不那么直观的数字列表而不是字符串。
    【解决方案3】:

    虽然@dogbert 的答案是最简单的解决方案,但IEx 本身提供了另一种抑制IEx 输出的有趣方法。最后只调用这个函数:

    IEx.dont_display_result
    

    所以,您可以在 IEx 中执行此操作:

    f = File.read!(my_large_file); IEx.dont_display_result
    

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2015-08-10
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2020-11-25
      相关资源
      最近更新 更多