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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 08:34:58

Tcl学习之--流程控制|过程的相关文章

java学习之流程控制之if

学编程吧java学习之流程控制之if发布了,欢迎大家通过xuebiancheng8.com来访问 java中的流程控制语句主要包括选择语句,循环语句,其中选择语句又包括if语句,switch...case语句,循环语句包括while,do...while和for循环等机构.下面来分析分析if...else的用法 if选择结构又分为if单分支结构,if...else...双分支结构,if...else if....else if ...else等多分支结构 单分支结构,顾名思义只有一个if结构.

F# 学习笔记(流程控制)

流程控制关键字 if: let mutable x = 17*17 - 15*15 if x % 2 = 1 then x <- x - 1 while: [<EntryPoint>] let main argv = let nr_fib n = let mutable a,b,i = 1I,1I,1 while i < n do let t = b b <- a+b a <- t i <- i+1 a (nr_fib 10).ToString() |> p

[原创]Scala学习:流程控制,异常处理

1.流程控制 1)do..while 1 def doWhile(){ 2 var line="" 3 do{ 4 line = readLine() 5 println("readlineConetent" + line ) 6 }while(line != " ") 7 } 2)for 方式一: 1 for (arg <-args) 2 println(arg) 方式二: 1 for (i <- 1 to 10 if i % 2

小Y的Python学习日志--流程控制(逻辑符)

#本文仅为个人学习过程的整理和记录,如有从他人博客.网站摘录的内容,本人会明确标明,如有涉及侵权,请联系本人,本人会在第一时间删除.  以下的资料整理来自(1)廖雪峰的Python教程 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000 (2)简明Python教程 http://woodpecker.org.cn/abyteofpython_cn/chinese/ (1)逻辑运算符

Shell基础学习(六) 流程控制

1.if if的语法格式 if conditon then command1 command2 ``` commandn fi 2.if else if conditon then command1 command2 ``` commandn else command1 command2 ``` commandn fi 3.if elseif else if conditon then command1 command2 ``` commandn else if conditon command

Python学习 之 流程控制

1.if else 语法:if expression1: statement1(s) elif expression2: statement2(s) else: statement3(s) 2.for 语法:for iterating_var in sequence: statements(s) 其中:sequence是序列(字符串.元组.列表中的任何一个)或字典 例1: #!/usr/bin/python fruits=['banana','apple','mango'] for index

java基础流程控制

流程控制结构导图: 今天主要学习了流程控制的语句是如何使用的: if格式: if (条件) { 循环体 } // 条件成立再执行循环体 while (条件) { } 以下是用循环语句写的一些小程序 for (int i = 1;i <= 100;i++) { if (i % 2 != 0) { continue; // continue 结束本次循环 } // break 结束本层循环 System.out.println(i); // 输出100以内的偶数 } for (int i = 1;i

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

《学习bash》笔记--流程控制

bash支持下述流程控制结构: if/else:如果某条件为真/假,执行一个执行列表. for:执行一个语句列表固定次数. while:当某条件为真时重复执行某语句列表 until:重复执行某语句列表直至某条件为真. case:依据一个变量取值执行几个语句列表中的一个. select:允许用户从一个菜单的可选列表中选择一个. 1.if/else 最简单的流程控制结构类型时嵌入在bash的if语句中的条件语句.当选择做或者不做某件事情或者依据条件表达式的真或者假 从数量不多的几个事情里选择一个进行