TCL基础知识入门(一)

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效果
Alt

认识

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 函数 后面没有参数输入,且后续脚本中没有被调用,从而达到注释目的
	}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值