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"
  }
}

このコードを使用して、手動でエントリを 1 つずつ配置すると、スクリプトは各エントリをチェックする時間があります。出力は次のとおりです。

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 に入る前に、実際には OS によって処理されます (端末エミュレーションの一部です)。できることはいくつかありますが (通常exec /bin/sttyは適切なオプションを指定して呼び出します)、実際にはそれほど役に立ちません。たとえば、値のエコーをオフにして、すべてのキーストロークを実行したとおりに処理することができます (それが-echoandrawオプションです) -raw。通常の端末入力を提供します。大変な作業です。

理論的には、readline のようなライブラリが役に立ちます。これらのライブラリは、すでに悪意のある stty ハッキングを行っています。あなたの特定のケースを除いて、あなたが望む厳密なインターリーブモデルは十分に一般的な要件ではないため、それらは役に立ちません。

あなたの立場で私が実際に行うことは、出力を書き直して、毎回チェックされる入力と結果 (「<code>"5" is OK」) を示すようにすることです。ファイルから解析しても、大騒ぎせずに何が起こっているのかを理解することができます.

于 2013-10-29T09:11:32.320 に答える
0

そこに a を追加するか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 に答える