Tcl学习之--流程控制|过程

switch命令: -->模式匹配

模式匹配,类似于if, elseif, else

第一个参数: 要检测的值

第二个参数: 一个或多个元素对的列表

看下下面三种表示方式:


switch支持三种模式匹配的方式:

-exact: 严格的字符串比较,默认

-glob: 全局匹配,参见stringmatch

-regexp: 正则表达式匹配

--:标记选项结束

NOTE: 通常情况下,应该总是使用—选项来标记选项的结束,确保switch命令都能正确识别检测字符串

l  source命令: --> 一个文件运行另一个文件

假如一个文件名为: 1.txt文件,里面有一条命令

source hello.tcl ;# 则调用运行hello.tcl文件

eval命令: -->创建和运行Tcl脚本的通用构造块

该命令接受多个参数,把它们用分隔符串联起来,然后把串联的结果作为一个Tcl脚本处理。因此这个命令可以包含多个命令,展开为多行,包含注释等.

如果编写一个应用程序,其中的脚本作为一个动态过程的结果产生,那么eval就是运行该脚本的适当方法。假如列表的变量,一种方案如下:

通常做法:

但下面的方式行不通,原因:unset命令的变量列表是一个参数,而不是分开的各个变量名,因此unset会试图删除一个名为a b c d的变量。

要达到上面的目的,可以用下面的几种方式:

while,for,foreach: -->循环命令

同其他语言一样,Tcl提供了三个用于循环的命令:while,for和 foreach.while命令 获取两个参数:一个表达式和一个Tcl脚本.它一直执行循环,直到条件为假.比如下面一个很简单的例子:

同样的脚本,用for 来改写就是:


第一个参数: 初始化脚本

第二个参数: 终止循环表达式

第三个参数: 初始化脚本

Foreach则相对最简单,先看个简单例子,要遍历男性,女性.


foreach 要有三个变量:

第一个是变量名

第二个是列表

第三个是构成循环体的Tcl脚本

foreach命令还可以并行处理多个列表,每个列表需要提供独立的变量集.没有对应的变量设为空字符串.


break,continue: -->循环控制

break:    终止循环

continue:终止当前循环,继续下一次循环

 

proc,return: à过程基础

proc --> 创建参数的命令

plus --> 过程名

{a b} --> 则是需要传递的两个参数

return --> 则是返回值,无的话为空

看下阶乘功能的实现

局部变量和全局变量

局部变量只在过程中有效,要想让其对全局也有效,必须加global关键字.

参数个数和默认参数


备注: 默认参数只能放置后面,提供参数的话则以提供为主,否则用默认参数.

args: 则是多个参数.

从上面例子可以看出args的用途,及如何遍历的.

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访问.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值