0

我正在寻找一种方法来标记每个条目之间的暂停,让脚本在继续之前检查每个条目。

例如,我有这个简单的代码:

for {set i 0} {$i<5} {incr i} {
  set x [gets stdin]
  if {[string is integer -strict $x]} {
      puts "It's OK"
  } else {
      puts "It's not OK"
  }
}

使用此代码,如果我手动逐个输入条目,则脚本有时间检查每个条目,这是输出:

5
It's OK
dd
It's not OK
kk
It's not OK
55
It's OK
99
It's OK

但现在如果我复制/粘贴:

5
dd
kk
55
99

现在是输出:

5
dd
kk
55
99
It's OK
It's not OK
It's not OK
It's OK
It's OK

有没有办法在每个条目之后给足够的时间让脚本有时间在进入下一个条目之前检查?

谢谢你。

4

2 回答 2

1

这很难做到。原因如下:粘贴文本的输出在进入 Tcl 之前实际上是由操作系统(它是终端仿真的一部分)处理的。尽管您可以做一些事情(通常通过exec /bin/stty使用正确的选项进行调用),但它们并没有那么大的帮助。例如,您可以关闭值的回显并完全按照完成的方式处理所有击键(即-echoandraw选项),但这使您不得不做很多工作来假装事情仍处于熟化模式(-raw),因为这就是提供正常的终端输入。这是很多工作。

从理论上讲,像 readline 这样的库会有所帮助:他们已经为您进行了邪恶的 stty 黑客攻击。除了在您的特定情况下,它们无济于事,因为您想要的严格交错模型不是一个足够普遍的要求。

我实际上在你的位置上所做的是重写输出,以便它说明每次检查的输入以及结果(“<code>“5”是OK”),然后我可以将这些值从文件中解析,最终仍然能够不费吹灰之力地弄清楚发生了什么。

于 2013-10-29T09:11:32.320 回答
0

在其中添加一个puts $x,或更改消息:

for {set i 0} {$i<5} {incr i} {
  set x [gets stdin]
  set ok [string is integer -strict $x]
  puts [format {%s %s OK} $x [expr {$ok ? "is" : "is not"}]]
}
于 2013-10-29T01:18:21.857 回答