1

我基本上有两个问题。我正在使用 JACL 解释器在 JAVA 中运行 TCL 脚本。

我的问题是:

  1. 运行 tcl 文件后如何从标准输出中获取数据?

  2. 使用 jatcl 执行时如何为 tcl 脚本传递参数?

例如:
sample.tcl:

`puts "Hi this is from tcl"  `

使用java运行时如下:

`Interp i = new Interp();
 i.eval("source sample.tcl");`

然后输出将被写入 JAVA 的 stdout 控制台。我想将该输出读取到某个变量,例如x[] = i.eval("sample.tcl")x 应该包含 Hi this is from tcl。

  1. 如何将一些参数传递给sample.tcl
4

1 回答 1

1

获得标准有点困难——你必须做很多工作来创建自己的 a 实例,tcl.lang.channel.Channel然后将其插入到 中TclIO.registerChannel(),这并不适合刚开始的人——但你通常不需要这样做如果您只是想与 Tcl 程序进行通信。脚本的结果(不是标准输出,而是脚本中最后一个命令的结果)将在完成后通过Interp'getResult()方法eval获得。

Interp interp = new Interp();
interp.eval("source sample.tcl");
String result = interp.getResult().toString();

更有可能的是,一旦你source编写了脚本,你就会在同一个解释器中调用命令并检查它们的结果。那效果要好得多。

Interp interp = new Interp();
interp.eval("source sample.tcl");
String arg = "abc";
interp.eval("sampleCommand " + arg);
String result = interp.getResult().toString();

如果你想传递更复杂的东西,最简单的方法是在调用脚本之前将你想传递的值存储在一个 Tcl 变量中,然后它可以在需要时将值从变量中提取出来。

interp.setVar("theVar", "the value, which may have spaces in it", 0);
interp.eval("sampleCommand $theVar");

如果你坚持阅读脚本标准输出,你可以试试这个:

Interp interp = new Interp();
TclByteArrayChannel tbac = new TclByteArrayChannel(interp);

// WARNING untested, but I think you have to unregister the old stdout first
TclIO.unregisterChannel(interp, TclIO.getStdChannel(StdChannel.STDOUT));
TclIO.registerChannel(interp, tbac);

interp.eval("source sample.tcl");

// The channel will have had *bytes* written to it, so that's what we ought to get
byte[] bytes = TclByteArray.getBytes(interp, tbac.getTclByteArray());

我真的不推荐这个。如果您使用任何其他语言(例如,C 或 C++)与 Tcl 交互,我也不推荐它。Tcl 被设计为在我之前描述的解释器结果级别进行集成;你会发现处理任何复杂的事情都容易得多。

于 2014-10-24T16:52:52.657 回答