【问题标题】:Linux can't print long ASCII list returned from Erlang prgramLinux 无法打印从 Erlang 程序返回的长 ASCII 列表
【发布时间】:2014-06-16 13:21:59
【问题描述】:

我有一个 Erlang 程序,返回值是一个很长的可打印列表。但是当列表的长度大于 65534 时,我在终端上看到的是裸整数列表而不是 ASCII 字符。

这是我的 Erlang 代码:

-module(test).
-compile([export_all]).

print_long(Num) ->
        [(X rem 95) + 32  || X <- lists:seq(1,Num)].

我从终端调用 Erlang 模块的方式:

erl_call -a 'test print_long [65534]' -n 'nodeName@hostname' -c SOMECOOKIE

Linux中的返回值有什么限制吗?

我想我可以对输出进行切片,但如何在终端上打印它们? 我试过 erlang:dispaly/0 但它不起作用。

【问题讨论】:

  • 我这里没有命令erl_call(R17,ERTS 6.0)。我错过了什么吗?编辑:当我在 Erlang shell 中运行您的代码时,我看到了正确的字符。
  • 此命令位于 /lib/erlang/lib/erl_interface-X.X.X/bin/erl_call。我不知道是否还有其他方法可以从命令行(不是 Erlang Shell)调用 Erlang 程序。只要你能从 Erlang 程序中得到返回值,我认为这个问题会被重现。
  • 我用erl_call 再次尝试,但仍然无法重现错误。附带说明一下,您也可以在没有 erlang shell 的情况下运行命令。例如,查看参数-eval-run-s
  • 嗨,evnu。不幸的是,我找不到这个问题的根本原因。但在我们的项目中,解决方案是将长列表写入一个带有 file:open/2 的临时文件。然后通过调用 shell 脚本 cat 文件。
  • @evnu。在 shell 脚本中:result=cat $filename; ehco $结果。这种解决方法对我们来说运行良好。是的,我同意你的观点,可以在不打开 erlang shell 的情况下调用 erlang 模块。但由于我们需要从 shell 脚本调用,link 推荐使用 erl_call。 导致标准输入被读取的选项可以作为 (Unix) shell 脚本中的脚本使用。

标签: linux erlang


【解决方案1】:

我想我找到了解决方法,并且必须回答我自己的问题。

调用流程时

SomeScript -> erl_call -> ErlangModuleAndFunc

脚本可以通过tty 命令获取终端信息(如/dev/pts/69)。然后,终端信息可以作为参数传递给 Erlang。在 Erlang 中,当程序员想要在终端上打印一些东西时,他/她只需调用os:cmd('echo YourWords &gt; /dev/pts/69')

这不是最好的解决方案,但确实有效。

【讨论】:

    【解决方案2】:
    $ erl -eval 'io:put_chars(test:print_long(65534))' -noshell -nostdio -s init stop | wc -c
    65534
    

    按预期工作。似乎问题在于您如何使用erl_call。你得到什么,你期望什么? nodeName@hostname 是否启动并运行?

    【讨论】:

      猜你喜欢
      • 2016-02-19
      • 2017-06-23
      • 2011-06-15
      • 1970-01-01
      • 2015-11-25
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多