Для тернарных условий мы должны использовать только логические значения, либо 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
%
Спасибо, отлично работает !, Интересно, что производительность все та же, независимо от того, используем ли мы тернарный оператор или оператор if? Оператор if использует expr за кулисами, поэтому я предполагаю, что он будет примерно одинаковым. – ericsicons
Да. Должен быть. (Может быть, Mr.Donal Fellows/Glenn Jackman прокомментирует, если я ошибаюсь с точки зрения внутренней заставки.) – Dinesh
Производительность не должна быть проблемой в любом случае. Я бы использовал 'if', потому что он более читабельный и поддерживаемый (менее« умный »). –