2013-10-28 112 views
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 

有沒有辦法給予了足夠的時間,每次輸入後,讓腳本纔去下一個入口檢查的時間?

謝謝。

+0

所以你想粘貼時暫停?粘貼在哪裏?命令行(Windows/Linux)? tkcon? –

+0

它在Linux下的命令行中,我正在尋找一種方法來給腳本足夠的時間來檢查每個條目,當我一次性複製/粘貼所有條目作爲此腳本的輸入時。 – user2669068

+0

在這種情況下,解決方案可能涉及'exec stty raw',通過char讀取輸入字符並將其回顯。我稍後會寫一個例子。 –

回答

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"}]] 
} 
+0

謝謝你的回覆。我剛剛嘗試過你的腳本,結果與我以前的腳本相同。該腳本沒有時間一次對每個條目做出響應,所有響應都放在最後。 – user2669068

+0

這是終端如何對粘貼文本作出反應的功能。它完全與Tcl無關。如果您擔心,請以不同的方式提供您的程序:'printf'%s \ n「5 dd kk 55 99 | your_program.tcl' –

1

這是令人驚訝的很難做到。原因如下:粘貼文本的輸出在進入Tcl之前實際上是由OS(它是終端仿真的一部分)處理的。儘管您可以執行某些操作(通常通過撥打exec /bin/stty並選擇正確的選項),但它們並沒有那麼重要。例如,您可以關閉這些值的回顯並完全按照完成的方式處理所有擊鍵(這是-echoraw選項),但是這會讓您不得不做大量工作來假裝事物仍處於烹飪模式(-raw)因爲這是正常的終端輸入。 這是一個lot的工作。

從理論上講,像readline這樣的庫會有所幫助:他們已經爲你做了邪惡的黑客攻擊。除了在你的特定的的情況下,它們將不會起作用,因爲你想要的嚴格交錯模型不是一個常見的足夠的要求。

我在你的位置上實際做的是重寫輸出,以便它說明每次輸入被檢查的結果以及結果(「"5" is OK」),然後我可以將這些值從a文件,並最終能夠弄清楚發生了什麼,沒有大驚小怪。