l switch命令: -->模式匹配
模式匹配,类似于if, elseif, else
第一个参数: 要检测的值
第二个参数: 一个或多个元素对的列表
看下下面三种表示方式:
switch支持三种模式匹配的方式:
-exact: 严格的字符串比较,默认
-glob: 全局匹配,参见stringmatch
-regexp: 正则表达式匹配
--:标记选项结束
NOTE: 通常情况下,应该总是使用—选项来标记选项的结束,确保switch命令都能正确识别检测字符串
l source命令: :
--> 一个文件运行另一个文件
假如一个文件名为: 1.txt文件,里面有一条命令
source hello.tcl ;# 则调用运行hello.tcl文件
l eval命令: -->创建和运行Tcl脚本的通用构造块
该命令接受多个参数,把它们用分隔符串联起来,然后把串联的结果作为一个Tcl脚本处理。因此这个命令可以包含多个命令,展开为多行,包含注释等.
如果编写一个应用程序,其中的脚本作为一个动态过程的结果产生,那么eval就是运行该脚本的适当方法。假如列表的变量,一种方案如下:
通常做法:
但下面的方式行不通,原因:unset命令的变量列表是一个参数,而不是分开的各个变量名,因此unset会试图删除一个名为a b c d的变量。
要达到上面的目的,可以用下面的几种方式:
l while,for,foreach: -->循环命令
同其他语言一样,Tcl提供了三个用于循环的命令:while,for和 foreach.while命令 获取两个参数:一个表达式和一个Tcl脚本.它一直执行循环,直到条件为假.比如下面一个很简单的例子:
同样的脚本,用for 来改写就是:
第一个参数: 初始化脚本
第二个参数: 终止循环表达式
第三个参数: 初始化脚本
Foreach则相对最简单,先看个简单例子,要遍历男性,女性.
foreach 要有三个变量:
第一个是变量名
第二个是列表
第三个是构成循环体的Tcl脚本
foreach命令还可以并行处理多个列表,每个列表需要提供独立的变量集.没有对应的变量设为空字符串.
l break,continue: -->循环控制
break: 终止循环
continue:终止当前循环,继续下一次循环
l proc,return: à过程基础
proc --> 创建参数的命令
plus --> 过程名
{a b} --> 则是需要传递的两个参数
return --> 则是返回值,无的话为空
看下阶乘功能的实现
l 局部变量和全局变量
局部变量只在过程中有效,要想让其对全局也有效,必须加global关键字.
l 参数个数和默认参数
备注: 默认参数只能放置后面,提供参数的话则以提供为主,否则用默认参数.
args: 则是多个参数.
从上面例子可以看出args的用途,及如何遍历的.
l upvar: -->传引用调用
Tcl只支持参数的传值调用。当调用Tcl命令时,是复制了参数的值然后将其传给命令。即使参数来自一个变量也是如此。因为Tcl解释器执行命令前会把参数替换为它的值。因此,在下面的示例中,sum命令获取到的变量是a和b中存储的值的副本。
sum $a $b
Tcl也不支持指针和引用类型,因此初看上去无法编写一个过程来改变已经存在的变量值。不过,变量的名称也是一个字符串值,它也可以存到一个变量中。因此,通过要求进行多一轮的替换,可以模拟出引用的行为,例如:
上面例子中,Tcl解释器把$y替换为它的字符串值x。然后执行set命令,把它的参数解析成一个变量的名称,返回存放在该变量中的值。Tcl中upvar命令,就可以实现与传引用调用相同的行为.
Upvar命令提供了当前过程的上下文范围之外的变量通用机制。可以用于访问全局变量,命名空间变量以及其他活动中的过程内的局部变量。最常见的使用是模拟传引用调用的行为,对数组特别有用。如果a是一个数组,就不能像myproc $a这样把它传给myproc过程,因为并没有对应整个数组的值;只有对应各个数组元素的值。但是,可以把数组的名字传给过程,如myproc a,然后使用upvar命令在过程中访问数组的元素。
下面是在过程中使用upvar的简单示例,输出一个数组的内容。
当调用printArray时,给出数组的名称作为参数。Upvar命令使得过程可以通过变量a访问这个数组。Upvar的第一个参数是过程的调用环境可见的变量。Upvar的第一个参数是过程的调用环境可见的变量。这可以是个全局变量,如本示例,也可以是个命名空间变量,也可以是调用过程的内部变量。
第二个参数是一个局部变量的名称。
Upvar命令把对局部变量a的返回重定向到调用环境中名为name的变量。这个示例中,当 printArray读取a时,它读取的都是info全局变量的元素。如果printArray向a写入,它就会修改info。printArray使用array names命令取得数组中所有元素的列表。然后用lsort把它们排序,再顺序输出这些元素.
Upvar命令的第一个变量名默认指向当前过程的调用者的上下文环境,不过,也可以访问调用堆栈中任意层次的变量,包括全局变量。
例如: upvar #0 other x
使用全局变量other 可以通过局部变量x访问.
版权声明:本文为博主原创文章,未经博主允许不得转载。