TCL:如何在if语句中进行替换

时间:2013-09-06 04:23:10

标签: tcl

考虑这段代码a是一个全局变量:

% set a 1
1
% # FirstCase 
% if "$a==1" "
       puts >>>>>>>>>>>>>>>>
"
>>>>>>>>>>>>>>>>
% # Second case
% if {$a==1} {
     puts >>>>>>>>>>>>>>>>
}
>>>>>>>>>>>>>>>>

在我的第一个案例中,我使用if发表了""声明。因此,a的替换将在此处完成。可以接受的。

在我的第二个案例中,我使用if发表了{}声明。如何在a替换? {}表示不替换,但仍然使用变量。在if相关代码中,它是否查找变量a的全局堆栈?

2 个答案:

答案 0 :(得分:2)

if命令与expr一样,旨在明确替换给定的参数。使用""分组是不可取的,因为它可能会导致双重替换。

与tcl中的其他命令一样,if实际上是一个函数。它不会查看全局堆栈,而是计算调用者堆栈中的表达式。

事实上,如果使用uplevel,你可以编写自己的版本:

proc _if_ {expression script} {
    # uplevel causes expr to be evaluated in the caller's stack:
    set condition [uplevel 1 "expr {$expression}"]

    if {$condition} {
        uplevel 1 $script
    }
}

答案 1 :(得分:0)

在你的第一种情况下:“$ a == 1”是一个字符串,而不是零值,这将使其成立:尝试 - >

% if "0" "
 puts >>>>>>>>>>>>>>>>
"

它不会通过这个条件。你在这里很幸运,因为“$ a == 1”的值不为零,如果变为真,则传递给值。

在第二种情况下:

% if {$a==1} {
    puts >>>>>>>>>>>>>>>>
}

$ a == 1 - >是一个条件本身。