如何在tcl中重新提示用户输入

时间:2013-07-24 18:41:24

标签: tcl

我有一个简单的用户输入提示,如下所示:

Is this correct? (Y/N): 

此提示只应采用YN,如果输入了任何其他输入,则应重新提示用户。

有人可以告诉我一些关于如何做到这一点的代码片段吗?我对Tcl仍然很新。

4 个答案:

答案 0 :(得分:1)

做得好不是很难。关键是在打印提示后记住flush,检查文件结尾(使用否定结果并调用eof)并在发生这种情况时采取措施停止并使用-strict来电string is

proc promptForBoolean {prompt} {
    while 1 {
        puts -nonewline "${prompt}? (Yes/No) "
        flush stdout;    # <<<<<<<< IMPORTANT!
        if {[gets stdin line] < 0 && [eof stdin]} {
            return -code error "end of file detected"
        } elseif {[string is true -strict [string tolower $line]]} {
            return 1
        } elseif {[string is false -strict [string tolower $line]]} {
            return 0
        }
        puts "Please respond with yes or no"
    }
}

set correct [promptForBoolean "Is this correct"]
puts "things are [expr {$correct ? {good} : {bad}}]"

答案 1 :(得分:0)

您可以使用以下代码段:从stdin(标准输入)获取数据,直到找到有效的内容。

puts "Is this correct? (Y/N)"

set data ""
set valid 0 
while {!$valid} {
    gets stdin data
    set valid [expr {($data == Y) || ($data == N)}]
    if {!$valid} {
        puts "Choose either Y or N"
    }
}

if {$data == Y} {
    puts "YES!"
} elseif {$data == N} {
    puts "NO!"
}

答案 2 :(得分:0)

我就是这样做的。它不敏感地接受yyesnno

proc yesNoPrompt {question} {
  while {1} {
    puts -nonewline stderr "$question (Y/N): "
    if {[gets stdin line] < 0} {
      return -1
    }
    switch -nocase -- $line {
      n - no {
        return 0
      }
      y - yes {
        return 1
      }
    }
  }
}

yesNoPrompt "Is this correct?"

答案 3 :(得分:0)

好吧,这会接受y,yes,true,1,n,no,false ......

proc isCorrect {} {
   set input {}
   while {![string is boolean -strict $input]} {
       puts -nonewline {Is this correct (Y/N)}
       flush stdout
       set input [gets stdin]
   }
   return [string is true -strict $input]
}
if {[isCorrect]} {
   puts "Correct"
} else {
   puts "not correct"
}