TCL基础
学习Tcl的笔记,一些基础概念。
TCL 开发环境安装配置
TCL工具是vivado 自带的 vivado TCL shell;
打开方式:vivado -> window -> tcl console
vivado 出了名的难用,又改为vscode编辑了,使用Activestate开发工具
官网位置:https://www.activestate.com/products/tcl/
或者使用我已经下载好的win10安装包
链接:https://pan.baidu.com/s/1sP_692OIcgeHDa5oDsjOfw?pwd=aobo
提取码:aobo
之后根据https://zhuanlan.zhihu.com/p/492866535这篇文章用vscode配置TCL开发环境
注:采用wish后vscode并不能成功运行,最后选用tclsh配置
vscode运行TCL效果
认识
1. TCL
TCL(tool command language) 是一种脚本语言,基于字符串的命令语言,解释性语言。(shell 一样)
1. 所有结构都是一条命令,包括语法结构
2. 所有数据类型都可视为字符串
(一切皆为字符串)
2. 命令语句
一条脚本由一个或几个单词构成,空格、Tab键隔开。 第一个单词为命令名,后面为参数。
命令可以换行或者**;**隔开, 分号会促使左侧命令不显示输出结果。
set x 5
5
set x 5 ; set y 6
6
set x 5 ; set y 6;
6
3. 变量赋值
变量赋值需要使用set 变量名 变量值
; C语言变量名有限制(字母、下划线),TCL没有任何限制,甚至可以是空格; 保持良好的代码风格,TCL区分大小写。
incr 变量名 (参数)
不加参数,执行第一个参数+1
的操作 ,有参数与第一个参数相加,初始化为0
, 第一个第二个参数都必须为整形。
set " " tcl
tcl
incr v # initial V = 0
1 # v + 1
incr v 2 # V + 2
3
incr v 1.5 # int
expected integer but got "1.5"
incr v
4
incr -2
1
incr v -2 # 4-2
2
put $errorInfo
expected integer but got "1.5"
(reading increment)
invoked from within
"incr v 1.5"
命令分为两块: 解析 和 执行
解析: 将命令分解为一个个独立的单词, 进行必要的substitution置换。
执行: 将第一个单词作为命令,去查找是否有定义,将后续参数传递进去。
errorInfo : 错误信息存储在全局变量errorInfo 中
unset
命令与 set
命令功能相反, 取消变量定义并释放变量所占用的内存空间。
info exists
命令判断变量是否被定义,存在则返回1,未定义返回0。取消未定义变量会报错。
info
命令主要查看TCL解释器的相关信息。~ tclversion
返回解释器版本信息,~ hostname
返回主机名。
4. 变量置换
有点类似于C语言的指针。
- .
会被解释器当做字符串分隔符;_
则不会。 对于含有分割符的变量需要用{ }
解释器才当做一个整体。
set x 5
set y x # 将字符x赋给y,x是字符不是变量
set z $x # 将变量的值赋值给z
set a-b-c hello
hello
set str $a-b-c
can't read "a": no such variable
set str ${a-b-c}
hello
set a_b 4
4
set y $a_b
4
set c $a_b${a-b-c}
4hello
set c ${a_b}_${a-b-c}
4_hello
set c ${a_b}7
47
set c $a_b7
can't read "a_b7": no such variable
append a_b $a_b
44
借助$
可以完成字符拼接,命令append
具有相同功能;
append + 变量名 + 新添加的字符串
;
嵌套置换$$a 不行 TCL在同一层次下遇到变量替换符只会置换一次;解释器从第一个$起开始算起到非法字符(字母、数字、下划线之外)为止为变量名
。
set a 5
=> 5
put $$a
=> $5
subst $$a
=> can't read "5": no such variable
subst $$var
=> 5
5. 命令置换
第二种置换形式:命令置换 [ ], [ ]中是另一条独立的Tcl命令(相当于命令嵌套), [ ]中可以有多条命令(使用空格或分号隔开)
# 较复杂置换
# 一
set var1 3.14
set var2 hello
set var3 -3
foreach num {1 2 3 } {
puts "var$num = [set var$num]"
}
=> var1 = 3.14
=> var2 = hello
=> var3 = -3
#二
set area [ expr {$var3 * $var3}]
# expr 命令会在解析set时执行,expr结果是set第二个参数
puts "area : [expr {$var3 * $var3} ]"
=> area : 9
#命令置换的嵌套
# string length 返回字符串长度
set len [expr { [string length $var2] + [string length $var3]}]
puts "len : $len"
=> len : 7
6. 反斜线置换
字符串中含有非法字符时[ 、空格、$、\
等时编译器会当做命令字符处理,导致报错。添加\
后可以被正确解释。
set str reg[x]
=> invalid command name "x"
set str reg\[x]
puts $str
=> reg[x]
1. TCl 在解析一条命令时只进行一次解析、一轮置换。(一条命令不是一行, [ ] 里面是一条命令);
2. TCL每个字符只发生一层置换。
7. “” 和{ }
双引号和花括号内的字符被当做一个整体,包括特殊字符。
双引号内的置换命令可以正常使用
;
花括号内的置换会被阻止,但当作为if等语句的界限符时不会
。
8. 注释与续行
#
注释符必须位于命令的第一个字符,语句之后会报错。
注释语句中出现\
注释语句会换行,但\
后不能跟任何字符(包括空格)。
大段代码块注释:
# 第一种 if {0}
if {0} {
}
# 第二种 {}
set commented_out {
XXXX
}
#第三种 proc过程
proc commented_out {} {
# proc 函数 后面没有参数输入,且后续脚本中没有被调用,从而达到注释目的
}