2016-03-13 1 views
2

Можно ли запускать условные команды с помощью тернарного оператора TCL?Условные команды TCL с использованием тернарного оператора

использование, если оператор

if {[string index $cVals $index]} { 
     incr As 
    } { 
     incr Bs 
    } 

Я хотел бы использовать тройной оператор следующим образом, но я получаю сообщение об ошибке

недопустимого имя команды «1» во время выполнения «[строка индекса $ cVals $ индекса ] прирастить Как: прирастить Bs»

[string index $cVals $index] ? incr As : incr Bs 

ответ

1

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

Таким образом, вы не можете использовать string index напрямую, так как он вернет символ или пустую строку. Вы должны сравнить, является ли строка пустой или нет.

Кроме того, для критериев условий прохождения/отказа мы должны приводить буквальные значения. Вы должны использовать expr для оценки выражений.

Основной пример может быть,

% expr { 0 < 1 ? "PASS" : "FAIL" } 
PASS 
% expr { 0 > 1 ? "PASS" : "FAIL" } 
FAIL 
% 

Обратите внимание, что я использовал двойные кавычки для строки, так как она имеет алфавиты. В случае цифр это не должно быть двойным кавычками. Tcl будет интерпретировать номера соответствующим образом.

% expr { 0 > 1 ? 100 : -200 } 
-200 
% expr { 0 < 1 ? 100 : -200 } 
100 
% 

Теперь, что можно сделать по вашей проблеме?

Если вы хотите использовать любые команды (например, incr в вашем случае), их следует использовать в квадратных скобках, чтобы отметить это как команду.

% set cVals "Stackoverflow" 
Stackoverflow 
% set index 5 
5 
% # Index char found. So, the string is not empty. 
% # Thus, the variable 'As' is created and updated with value 1 
% # That is why we are getting '1' as a result. 
% # Try running multiple times, you will get the updated values of 'As' 
% expr {[string index $cVals $index] ne {} ? [incr As] : [incr Bs] } 
1 
% info exists As 
1 
% set As 
1 
% # Note that 'Bs' is not created yet... 
% info exists Bs 
0 
% 
% # Changing the index now... 
% set index 100 
100 
% # Since the index is not available, we will get empty string. 
% # So, our condition fails, thus, it will be increment 'Bs' 
% expr {[string index $cVals $index] ne {} ? [incr As] : [incr Bs] } 
1 
% info exists Bs 
1 
% 
+0

Спасибо, отлично работает !, Интересно, что производительность все та же, независимо от того, используем ли мы тернарный оператор или оператор if? Оператор if использует expr за кулисами, поэтому я предполагаю, что он будет примерно одинаковым. – ericsicons

+1

Да. Должен быть. (Может быть, Mr.Donal Fellows/Glenn Jackman прокомментирует, если я ошибаюсь с точки зрения внутренней заставки.) – Dinesh

+3

Производительность не должна быть проблемой в любом случае. Я бы использовал 'if', потому что он более читабельный и поддерживаемый (менее« умный »). –