Как установить значения по умолчанию для переменных Tcl? - PullRequest
0 голосов
/ 11 мая 2009

У меня есть несколько сценариев Tcl, которые выполняются путем определения переменных в вызове командной строки:

$ tclsh84 -cmd <script>.tcl -DEF<var1>=<value1> -DEF<var2>=<value2>

Есть ли способ проверить, не определены ли var1 и var2 в командной строке, а затем назначить им набор значений по умолчанию?

Я попробовал ключевые слова global, variable и set, но все они дают мне эту ошибку, когда я говорю "if {$<var1>==""}": "can't read <var1>: no such variable"

Ответы [ 3 ]

5 голосов
/ 11 мая 2009

Я не знаком с опцией -def в tclsh.

Однако, чтобы проверить, установлена ​​ли переменная, вместо использования «catch» вы также можете использовать «информация о существовании»:

if { ![info exists blah] } {
  set blah default_value
}
1 голос
/ 11 мая 2009

В качестве альтернативы вы можете использовать что-то вроде пакета cmdline из tcllib. Это позволяет вам устанавливать значения по умолчанию для двоичных флагов и аргументов имя / значение, а также давать им описания, чтобы можно было отображать отформатированное справочное сообщение. Например, если у вас есть программа, для которой требуется имя входного файла и, необязательно, имя выходного файла и двоичная опция для сжатия вывода, вы можете использовать что-то вроде:

package require cmdline
set sUsage "Here you put a description of what your program does"
set sOptions {
    {inputfile.arg ""  "Input file name - this is required"}
    {outputfile.arg "out.txt"     "Output file name, if not given, out.txt will be used"}
    {compressoutput       "0"      "Binary flag to indicate whether the output file will be compressed"}
}

array set options [::cmdline::getoptions argv $sOptions $sUsage]
if {$options(inputfile) == ""} {puts "[::cmdline::usage $sOptions $sUsage]";exit}

Суффикс .arg указывает, что это аргумент пары имя / значение, если его нет в списке, он будет предполагать, что это двоичный флаг.

0 голосов
/ 11 мая 2009

Вы можете catch свою команду, чтобы предотвратить ошибку при отмене сценария.

if { [ catch { set foo $<var1> } ] } {
    set <var1> defaultValue
}

(Предупреждение: я не проверял точный синтаксис с помощью интерпретатора TCL, приведенный выше сценарий просто для наглядности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...