T脚本语言学习记录-工具(一)
1、set & unset
1 %set a Hello ;#定义变量 a 并赋值 2 =>Hello 3 %puts $a ;#输出变量值 4 =>Hello 5 %set a “Test Tcl” ;#重新赋值 6 =>Test Tcl 7 %set a ;#输出变量值,此时不加”$” 8 => Test Tcl 9 %puts $a ;#输出变量值,此时要加”$” 10 =>Test Tcl 11 %puts a ;#输出字符”a” 12 => a 13 %set b $a ;#将 a 的值赋给 b 14 =>Test Tcl 15 %puts $b 16 =>Test Tcl 17 % unset a ;#释放变量 18 %puts $a ;#试图输出未定义变量的值 19 => can't read "a": no such variable
2、$ & []
1 %set foo oo 2 =>oo 3 %set dollar foo 4 =>foo 5 %set x $$dollar 6 =>$foo ;#只解释一次,将“ $dollar”用 dollar 的值( foo)代替, 7 ;#命令等效为 set x {$foo},大括阻止替换。 8 % set x {$foo} 9 =>$foo 10 %set y $x 11 =>$foo ; #一轮替换 12 13 % set b [set a 5] ;#set a 5 命令输出的结果赋给 b 14 =>5 15 %puts $b ;#方括号命令替换,expr表示进行数学计算,外围用方括号括起来 16 =>5 17 %set c [expr 5 * 10] ;#将乘式结果赋给 c 18 =>50
3、" " & { }
双引号和花括号将多个单词组织成一个参数,也是一种替换操作。如果花括号是用做替换操作,则它会阻止内部的嵌套替换,如果花括号用做界限符,如过程定义时用做界限过程体时,不阻止替换操作,其他还有 if 条件语句、循环语句、 switch 语句和过程声明、数学表达式等。
%set s hello =>hello %puts stdout "The length of \"$s \"is [string length $s]" ;# “string length” 命令是计算 6 Tcl 编程初步 ;#字符串长度,用反斜杠”\”来引用特殊字符。 =>The length of hello is 5 %puts stdout {The length of $s is [string length $s]} =>The length of $s is [string length $s] ;#替换操作被阻止 %set x 10 =>10 (bin) 35 % set y 20 =>20 (bin) 36 % set z [expr {$x + $y}] ;#expr 表示进行数学运算,要用[]括起来 =>30 ;#用{}来组织算术表达式,不阻止$替换操作 % if { $x == 10} { puts “x=$x”} => x=10 ;#在条件语句中, {}用来界定条件体和执行体,不阻止内部替换
4、 \
% set x 100 =>100 %set y "$x" =>100 %set y "\$x" =>$x ;#引用$符 %puts "he\nllo" ;#回车换行 =>he llo %puts "\a" ;#震铃(需要在 tclsh 下运行) % set b [puts \ $y ] ;#代码换行 =>$x
5、incr
incr 命令根据指定的步长来增加或减少参数的值。当步长为负时,减少参数值;当步长为正
时,增加参数值。默认步长为+1。
%set a 10 ; incr a =>a=11 %set a 10 ; incr a –1 => a=9
6、基本命令集
命令 描述
append 将值追加到字符串尾
binary 二进制字符串操作
format 字符串格式化
regexp 正则表达式(用于字符串模式匹配)
regsub 用正则表达式进行字符串模式匹配和替换
scan 字符串分解
string options 字符串操作和命令集
subst 字符替代(替代特殊字符)
- append
%set var1 Hello %set var2 World %append var1 $var2 =>HelloWorld %puts $var1 =>HelloWorld ;#var1 的内容被更改!
- format
-
;#要取第 2 个变元值,即 5。位置说明符的格式为 2$,并用\来引用符号$: % set res [format "%2\$s" 1 5 9] =>5 %puts $res =>5 % set str [format "%3\$s %1\$s %2\$s" "are" "right" "You"] => You are right
-
1 %format "%x" 20 2 =>14 ;# 将 20 转换为十六进制数 3 %format "%8x" 20 4 => 14 ;# 将 20 转换为十六进制数,8 位数据宽度,右对齐 5 %format "%08x" 20 6 7 =>00000014 ;#与上一命令相似,但用 0 添齐 8 %format "%-8x" 20 9 =>14 ;#宽度 8 位,左对齐 10 %format "%#08x" 20 11 =>0x000014 ;#将 20 转换为十六进制数,并添加前缀”0x”, 12 ;#总宽度为 8 为,右对齐(默认),前导空格用 0 补齐。 13 % set c [format %c%e%c 40 30000 41 ] 14 => ( 3.000000e+004) ;#%c 将整数转换为对应的 ASCII 字符, 40 和 41 分别对应”(“和”)” 15 % set num [scan Aa %c var1 ] 16 => 1 ;#将字符串”Aa”的第一个字符”A”转换为对应整数, 17 ;#并赋值给 var1 变量,返回成功转换个数 18 % puts $var1 19 => 65 ;#字符 A 对应的整数
上例最后一个 format 格式命令中, ”%c”一个整数转换为对应 ASCII 字符输出
- scan
-
%set num [scan "abcABC" "%c%c " var1 var2] => 2 %puts "$var1 $var2" => 97 98 % set num [scan "abcABC" "%c%c" ] => 97 98 %puts $num => 97 98 ;#忘记指定输出变量的结果 ;#格式描述说明要扫描小写的 a 到 z 区间的连续字符,用到了花括号表明是一个集合 % scan "abcABC" {%[a-z]} res => 1 % puts $res => abc % scan "ABCabc" {%[A-b]} res => 1 % puts $res => ABCab % scan "ABCab" {%[^a-b]} res =>1 ;#匹配非 a 到 b 的字符 % puts $res =>ABC % scan ABCab {%2[^a-b]} res =>1 ;#照样可以指定匹配字符数 % puts $res =>AB
- binary
-
1 %set b [binary format "s" 25664] 2 => @d ;#整数 25664 以十六进制表示为 6440H。 “s”为格式说明 3 ;#符,按照由低到高字节顺序存储。 4 % puts $b ;#数值被压缩为两个字节,输出的结果为两个压缩字节对 5 => @d ;#应的两个字符, @的 ASCII 码为 40H, d 的 ASCII 码为 64H 6 % binary scan $b "s" var 7 => 1 ;#返回转换成功的次数 8 % puts $var ;#binary scan 从二进制数 b 中将数值恢复并存入变量 9 var 10 => 25664 11 % binary scan 1 c var ;#从字符 1 中恢复数值。字符 1 的 ASCII 码=31H, 31H 对应十 12 =>1 ;#进制整数为 49 13 % puts $var 14 => 49
-
subst
-
% subst { a=$a sum=[expr 1 + 2]} => a=foo bar sum=3 % subst { a={$a} sum={[expr 1 + 2]}} => a={foo bar} sum={3} ;#数据内部的花括号不阻止替换