2. TCL脚本中的注释符是'#',但'#'必须出现在TCL解释器期望命令的第一个字符出现的地方才被当作注释。
%#This is a comment
%set a 100 # Not a comment
wrong # args: should be "set varName ?newValue?"
%set b 101 ; # this is a comment
101
例如下例在执行时就会陷入死循环,如果在body中加入"if {$x >6} break"语句则不会如此。特此说明。
% set x 0
% while ($x<5) {
incr x
puts "x is $x"
}
修改方案:
% set x 0 或 % set x 0
% while {$x<5} { % while ($x<5) {
incr x incr x
puts "x is $x" puts "x is $x"
} if {$x>6} break
}
7. 空格问题:在编写TCL脚本的时候,除了要注意语法,格式上也要特别当心。比如很多时候,其实只是空格惹的祸。
a. 有些空格必不可少,如If {} { ;
b. 有些空格不能多加,比如在上面的例子中,如果书写如下,
% set x 0
% while ( $x<5) {
incr x
puts "x is $x"
if {$x>6} break
}
出现如下错误提示:
wrong # args: should be "while test command"作者: ameg3 时间: 2009-12-9 16:51 标题: xuexitcl 问题5: TCL扩展函数编写时需注意的一个问题
案例分析:
在对应扩展函数Tcl_ApcInitCmd()中,devNum被声明为U8类型,对应源码如下:
U8 devNum
…
if (Tcl_GetIntFromObj(interp, /* INTL: Tcl source. */
objv[1], &devNum) != TCL_OK)
{
Tcl_AppendResult(interp,"Expect devnum is an integer ",NULL);
return TCL_ERROR;
}
而函数Tcl_GetIntFromObj()的原型如下:
Tcl_GetIntFromObj(interp, objPtr, intPtr)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
register Tcl_Obj *objPtr; /* The object from which to get a int. */
register int *intPtr; /* Place to store resulting int. */
1. split命令: //字符串分割
语法:split string ?splitChars?
把字符串string按分隔符splitChars分成一个个单词,返回由这些单词组成的串。如果splitChars是一个空字符{},string被按字符分开。如果splitChars没有给出,以空格为分隔符。例:
% split "how.are.you" .
how are you
% split "how are you"
how are you
% split "how are you" {}
h o w { } a r e { } y o u
2. scan命令://字符串分析
语法:scan string format varName ?varName ...?
scan命令按format提供的格式分析string字符串,返回匹配的变量个数,然后把结果存到变量varName中,如果变量varName不存在的话,TCL会自动声明该变量。注意,除了空格和TAB键之外,string和format中的字符及'%'必须匹配。
例如:
% scan "some 26 34" "some %d %d" a b
2
% set a
26
% set b
34
% scan "12.34.56.78" "%d.%d.%d.%d" c d e f
4
% puts [format "the value of c is %d,d is %d,e is %d ,f is %d" $c $d $e $f]
the value of c is 12,d is 34,e is 56 ,f is 78