Tcl语言学习--基础知识
一、脚本、命令和单词符号
一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开。
1、关键字/变量
变量是程序的基础
变量组成:变量名、变量值
变量名要求:任何字符串都可以作为变量名,区分大小写
变量值要求:任何字符串都可以作为变量值
⦁ 变量赋值基本语法:
set varname value;
e.g:
set x 10;
set text “Hello,World”
2、置换
TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如
set x 10; #定义变量x,并把x的值赋为10
set y x+100;#定义变量y,y的值是x+100,而不是我们期望的110
上例中的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10',就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单次本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套
set x 10
⦁ 变量置换
变量置换由一个$符号标记
set y $x+100; #y的值为10+100,这里x被置换成它的值10;
⦁ 命令置换
命令置换是由[]括起来的TCL命令及其参数
set y [expr $x+100]; #y的值为110;
y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+100'传递给该命令过程进行处理。
注意:[]中必须是一个合法的TCL脚本,长度不限。[]中脚本的值为最后一个命令的返回值,例如:
set y [expr $x+100;set b 300]; # y的值为300,因为set b 300的返回值为300
⦁ 反斜杠置换
set y \$x+100;#y的值为$x+100;
⦁ 释放变量:
unset x;
3.双引号和花括号
TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号({}).
TCL解释器对双引号中的各种分割符将不作处理,但是对于换行符以及$和[]两种置换符会照常处理。例如
set x 100
set y "$x ddd"; # y的值为100 ddd
而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。
set y {/n$x [expr 10 +100]}; #y的值为/n$x [expr 10 +100]
4.注释和输出
TCL中的注释符是‘#’,‘#’和直到所在行尾的所有字符都被TCL看作注释,TCL解释器对注释将不作任何处理。
不过,需要注意的是,“#”必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。例如:
set a 100 # Not a commnet
上述命令不是一个注释,会报错
set a 100; # this is a comment
上述才是一个有效的注释
第一个命令中“#”不被当作注释符,因为它出现在命令行的中间,TCL解释器把它和后面的字符当作命令参数处理,从而导致错误。而第二个命令中“#”就被当作注释,因为前一个命令已经使用了一个分号结束,TCL解释器期望下一个命令接着出现,现在这个位置出现“#”,随后的字符就被当作注释了。
puts :输出文本,多个单词如被空格或TAB分隔需要使用“”或{} 括起来;多个命令写在一行使用 ; 间隔。
puts Hello # 正确
puts Hello,World ; # 正确,多个单词之间不是被空格或者TAB分隔开
puts Hello World; # 这行命令运行出错,被空格分隔
puts "Hello, World - In quotes" ; # 注释
puts {Hello, World - In Braces}
puts "This is line 1"; puts "this is line 2"; # 正确,用分号分隔两个命令
puts "Hello, World; - With a semicolon inside the quotes" ; #正确,分号在双引号内,作为字符串一部分
二、数据类型
tcl的数据类型实际上只有一种:字符串
在tcl中变量没有类型转换或者类型匹配的问题,所有的“数据”都是以字符串的形式存在,那么tcl如何进行数值计算?如何输出一个小数?
数值计算:
tcl支持各种数学函数的数值计算,但是仅能在expr命令中使用
e.g:
set angle 30;
set radian [expr $angle*3.1415926/180.0];
set value [expr sin($radian)];
value值为0.499999992265;
数据类型输出
在输出数据到文件或者屏幕时,format命令可以用于控制显示的格式确保它按要求输出。
e.g:
set vlaue1 [format %.1f $value];
value1的值为0.5;
三、数据结构-List
List是tcl语言里功能给常强大非常灵活的应用最多一种数据结构之一,一个列表可以有任意多个元素,每一个元素都可以是任意的字符串,最简单的列表就是包含由任意个空格、制表符、换行符分隔开的任意多个元素的字符串。
e.g:
john anne mary jim;
创建一个列表
set x [list 1 2 3 4];
按指定分隔符将一个字符串拆分为列表
set string “1,2,3,4”;
set x [split $string “,”];
从列表中取出一个元素
set value1 [lindex $x 0];
set value2 [lindex $x 1];
set value3 [lindex $x 2];
set value4 [lindex $x 3];
四、数据结构-Array
在Tcl中,除了简单变量,还提供了数组,数组是元素的几何,每一个元素都有自己的名称和值。数组由两部分组成,即数组名和数组中的元素名,数组名和元素名都可以是任意字符串,因此在使用过程中一定要注意区分空格、双引号等字符。
创建数组
set student(name) “张三”;
set student(age) 15;
set student(gender) “男”;
查询数组
array size student;查询数组student中的元素个数
array names student;查询数组student的元素名称
多维数组
set grade(jim,chinese,english) [list 98 99];
set grade(peter,chinese,english) [list 96 100];
五、控制结构
控制结构有很多种类,包括条件、循环、异常处理、底层的条件处理等。
常见控制语句 |
解释 |
if {expression} {body1} else {body2}; if {expression1} {body1} elseif {expression2} {body2} |
条件执行语句,其中的else 或者else if并不是必须存在的 |
foreach value valuelist {body} |
valuelist是一个链表数据,该命令将遍历valuelist中的每一个值,每遍历一次执行一边body |
switch $var {a {body1};b {body2};c {body3}} |
用一个值与很多模式比较,执行能匹配的那个模式所对应的body |
for {init} {test} {reinit} {body} |
将init作为初始量,将test作为表达式,如果为真则执行body,然后再讲reinit作为初始量重复执行该过程。 |
while {test} {body} |
将test作为表达式处理,如果其值为真,则执行body,然后再处理test重复这个过程 |
return |
结束一个函数返回value值 |
break |
用于终止最内层的循环 |
continue |
用于终止最内层循环的当前迭代步,进行该命令的下一个迭代步 |
catch {body} |
命令异常处理,当没有异常是返回值为0,否则返回非0值 |
六、程序结构
source :可以把一个外部的tcl文件在此处展开执行
global :指定某些变量是全局可用的。在tcl中,主程序里的变量并不是全局可用的,必须在出程序或过程里用global声明后,才能在过程里引用。
proc :说明一个子过程,后面接过程名、参数列表、执行体。需要注意的是,过程的参数列表应该和调用处的参数一致。但例外的是,如果过程的参数只写一个,它就可以以list的形式接收多个入口参数。
proc讲解:
1. 格式:proc name args body
2. 调用方法中参数可以用花括号或者双引号包含,也可以不包含
3. 在puts等命令中需要置换的话,需要使用方括号
例子:012_proc.tcl
proc sum {arg1 arg2} {
set x [expr $arg1+$arg2];
return $x ;#过程返回值
}
puts " The sum of 2 + 3 is: [sum 2 3]\n\n" ;#调用过程
#puts " The sum of 2 + 3 is: [sum {2 3}]\n\n" ;#出错,提示找不到第二个参数,置换过程中第一个参数是{2 3},所以找不到第二个参数
puts " The sum of 2 + 3 is: sum(2 3)\n\n" ;#输出sum(2 3),因为没有方括号,根本没有进行置换
puts " The sum of 2 + 3 is: sum{2 3}\n\n" ;#输出sum{2 3},因为没有方括号,根本没有进行置换
sum 2 3 ;#正确
sum {2} {3} ;#正确
sum "2" "3" ;#正确
过程PROC的参数定义
讲解:
1. 过程的参数赋缺省值:proc name {arg1 {arg2 value}}
2. 过程的不确定个数的参数定义:proc name {arg1 args}
proc example {first {second ""} args} { ;#参数定义:赋缺省值和不确定个数参数定义
if {$second == ""} {
puts "There is only one argument and it is: $first";
return 1;
} else {
if {$args == ""} {
puts "There are two arguments - $first and $second";
return 2;
} else {
puts "There are many arguments - $first and $second and $args";
return "many";
}
}
}
set count1 [example ONE]
set count2 [example ONE TWO]
set count3 [example ONE TWO THREE ]
set count4 [example ONE TWO THREE FOUR]
puts "The example was called with $count1, $count2, $count3, and $count4 Arguments"
Tcl语言学习--基础知识的更多相关文章
- go语言学习-基础知识
go程序的基本结构 一个可以最简单的可运行的go程序需要满足下面两个条件: 有一个main()函数 main()函数在main包中 例如: 在go语言中的 hello world 程序如下: // m ...
- Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识
JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...
- c语言学习基础:[1]开发工具介绍
标签:c语言 1 2 3 4 分步阅读 学习编程语言的童鞋们一开始接触到的最多的估计就是C语言了,其次才是什么java.c++等,可以说学习c语言是我们走向编程世界的一座桥梁,学好它,对于我们学习和研 ...
- Matrix学习——基础知识
以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明. 首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部 ...
- JAVA学习基础知识总结(原创)
(未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...
- 【值得收藏】C语言入门基础知识大全!从C语言程序结构到删库跑路!
01 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { ...
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- ansible学习基础知识和模块(一)
基础知识补充: 常用自动化运维工具 Ansible:使用python来开发的,无需设置Agentless(代理),一般管理几百台.与ssh的方式也不一样,ssh是基于c/s模式(客户端+服务器)来使用 ...
- 20165333 学习基础和C语言学习基础
说实话,我并没有什么技能比90%以上的人更好,非要拿一个出来的话,篮球勉强好一点吧.最初接触篮球是小学的时候跟着哥哥看他打球,哥哥的球技在同龄人中算是好的,每次看他各种突破过人,我都觉得特别潇洒帅气, ...
随机推荐
- A♂G&C012
A♂G&C012 A AtCoder Group Contest 从大到小sort后输出\(a_2+a_4+a_6+\ldots a_{2n}\) 好♂啊,只会背结论/kk B Splatte ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- 新款戴尔笔记本win10系统改win7 安装教程
下载U盘启动制作工具 及戴尔DELL ghost win7 旗舰版GHO 文件 下载地址:http://pan.baidu.com/s/1c17JqpU 插入制作好的U盘启动盘,开机按F2进入BIO ...
- 记一次cpu指标异常的跟踪排查
问题描述: 最近在测试环境的服务器上,无意中发现cpu持续飙高.最高的时候达到了200%经过反复重启无效之后,决定挖掘深层次的原因 通过top命令打印出消耗cpu的pid,如图 通过ps -mp 24 ...
- eclipse tomcat 热加载 免除重启
Tomcat的热部署(以后就不用重起了) 1. tomcat上的部署问题,有时候也是个麻烦的问题,要是不采用热部署,我们就只能每次对原来的文件做一次改动的时候就要重新部署, 而每次重新部署都 ...
- 【面向对象】第四单元总结——UML
本单元构架设计 统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的 ...
- 微信小程序怎么获取page/index/main后面的参数
请求例子:page/index/main?id=123,如何获取123? mpvue框架在onLoad(options)函数里面获取options.id即可. 用的框架不同,onLoad的函数不同.原 ...
- bad ELF interpreter: No such file or directory
1.在64系统里执行32位程序如果出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory,安装下glic即可 yum ...
- 工具系列 | PHPSTROM 连接Docker容器 && 配置XDEBUG调试
Docker 客户端配置 PHPSTROM 配置 选择连接 容器日志 配置Xdebug 开启Debug模式 打断点 浏览器访问该项目地址:http://wiot.frp.tinywan.top/
- IntelliJ IDEA多屏后窗口不显示问题解决(用工具一键解决)
IDEA 在接入外接屏且扩展的情况下,如果突然拔掉外接屏,就可能会产生IDEA 整个窗口只在屏幕的右侧显示一点点边框且无法拖拽到当前屏幕的情况. 在不再次接入外接屏的情况下,想要把IDEA窗口拖拽回当 ...