Я изучаю ткл.
Я написал код.
test.tcl
set design C
set Z 0
if {${design} == "A"} {
set Z 5
} elseif {${design} == "B"} {
set Z 10
#} elseif {${design} == "C"} {
# set Z 15
} else {
set Z 20
}
puts "Z = ${Z}"
затем запустите: tclsh test.tcl
почему я получил ответ: Я = 0
вместо: З = 20
Разве я не могу так отметить?
Отредактированный вопрос — это вопрос, который я изначально хотел задать.
Это странно в том, как работает Tcl. См. Почему я не могу разместить несовпадающие фигурные скобки в комментариях Tcl
Вы можете назвать это странным. Я называю это последовательным. :-)
Ваш синтаксис неверен.
set design C
set Z 0
if {$design == "A"} {
set Z 5
} elseif {$design == "B"} {
set Z 10
} else {
set Z 20
}
puts "Z = $Z"
См. https://onecompiler.com/tcl/42r9yg9cg
Какая часть неправильного синтаксиса приводила к печати Z = 0
вместо Z = 20
?
Синтаксис Tcl очень прост. Каждая команда состоит из имени команды и нуля или более аргументов. В Tcl команда if
аналогична любой другой команде. Никаким особым образом это не лечится. Итак, интерпретатор Tcl принимает вашу команду и разделяет ее на имя команды (if
) и следующий список аргументов (пробелы переформатированы для ясности):
Команда if
оценивает первый аргумент. Это «ложь», поэтому второй аргумент пропускается. Поскольку третьим аргументом является «elseif», затем проверяется четвертый аргумент. Продолжая в том же духе, он в конечном итоге сталкивается с аргументом №7, условием {${design} == "C"}
. На это не влияет символ «#» внутри аргумента №5. Поскольку $design фактически имеет значение «C», это условие оценивается как «истина», в результате чего аргумент № 8 выбирается в качестве части тела для выполнения. Этот аргумент состоит из одной строки, начинающейся с «#», поэтому он рассматривается как комментарий. Теперь команда if
выполнила свою работу и Z остается неизменным.
На самом деле {} не являются частью аргумента. Я просто сохранил их в качестве ориентира для группировки.
Я так понимаю это? Интерпретатор tcl сначала сопоставит фигурные скобки, чтобы сгруппировать их, а затем проигнорирует командные строки, начинающиеся с #.
Вы отредактировали свой вопрос, чтобы исправить синтаксические ошибки, вызвавшие проблему, что сделало недействительными ответы, приведенные ниже.