Tcl学习之--语法|变量

语法|变量

脚本、命令和单词

Tcl提供了大约100条命令,Tk提供了另外几十条,脚本包含一条或多条,通过换行符或分号分隔开.

set a 12

set b 23

也可以写成一行: set a 12; set b 23

每个命令由多个单词组成,以空格来分隔,首字母为命令名,所以:

1. set -> 单词,同时也是命令名

2. a    -> 单词

3. 12  -> 单词,将该值赋予a

处理命令

Tcl处理命令分两步: 解析和执行

1)  在解析阶段,Tcl进行一系列简单字符串操作,比如将$input变量中存放的input字符串来代替

2)  在执行阶段,命令中的各个单词有了具体含义。Tcl把第一个单词作为命令名称,并根据传递过来的参数,执行该命令。

图示如下:

替换

方式一:变量替换

例1: 计算或赋值

例2: 创建4个按钮事件 分别为 .b1,.b2, .b3, .b4

% foreach num {1 2 3 4} { button.b$num }

备注:

替换不影响命令中每个单词的分割,即使替换后的字符包括空格,制表符,换行符,等空白字符,也不影响。

方式二: 命令替换

备注:

命令替换是把一个单词的部分或全部替换为一个命令的结果,通过[]来进行,会调用[]中的命令,比如上面的expr命令.

方式三: 反斜杠替换

用于向单词中插入像\n、[、$、空格符这样会被Tcl解析器认为有特殊含义的字符,如下所示:

备注:

反斜杠替换和一般的替换不同,这种替换在Tcl解释器解释命令前就要单独进行,这意味着用于替换空格符会被作为单词分隔符看待,除非它们被””或{}括起来.

双引号引用

Tcl中提供了一些方法,可以阻止解析器对$和分号等字符进行处理,这些方法称为引用。

例1: 要将hello world赋给msg,不用双引号的话会报错.

这个时候就需要引用:

例2: 将空格、制表符、换行以及分号做普通字符处理.

例3: 将msg设置为包含一个变量名,该变量平方等信息的字符串

大括号引用

如果说双引号对\n还会做特殊处理的话,那么大括号则是更彻底的引用形式,它会取消其中所有特殊字符的特殊意义。所有的空格,制表符,换行符以及分号都会作为普通字符处理。

例1: 将上面msg信息如实打印出来

参数展开

Tcl会将一个列表作为参数传递给一个过程。先看一个例子:

例1: 要将d:\test目录下,所有.h结尾的文件删除.

像上面是删除不掉的,为什么呢?因为glob命令返回的是一符合*.h形式的文件列表,例如a.h, b.h, c.h, d.h,整个文件列表作为一个参数传递给file delete命令,会因为找不到a.h, b.h,c.h,d.h而删除失败.那么要如何删掉呢?

方式一: 开头加个{*}

方式二: 文件名全部列出

方式三: 借助eval命令解析,让其重新传给filedelete

注释

如果一条命令的第一个非空白字符是#,那么这一行将被视为注释。注意:注释符必须出现在Tcl预期将获得命令的第一个字符位置上。如果注释出现在其他地方,会被看作一个普通字符,看成一个命令单词的一部分。

第二行#出现在一条命令中间,导致该set命令接收到3个参数,所以错误。最后一个#被视为注释符是因为它紧接在标志一条命令终止的;后面。要准确理解上面标红的意思,再看下面两个例子。

例1: {}中非注释的情况

{}中的所有字符被视为一个参数,作为字符串赋给set指定的变量,所以不是注释!

例2: {}中注释的情况

这里面有两个{},if命令会把第一个{}视为boolean型表达式处理,如果为真的话,它会调用Tcl解释器将第二个参数作为Tcl脚本处理。在Tcl解析器再次进行解析时,以#开头的第一行才被识别为注释。

例3: 出现在注释中的大括号常导致错误

另外一种用途,用if命令来将多行注释。看下面例子.

在Java中可以用

/*

*/

在Python中用三个单引号对,或三个双引号对来多行注释。

Tcl中可以用if 命令来达到同样的效果: 多行注释的问题。

If 0,即条件为假,下面的分支就不走了,从而达到注释的目的。

errorInfo

异常返回的时候,错误信息会保存在全局变量errorInfo中,

出现错误后,Tcl会把errorInfo设置为一个栈,保存产生错误的确切位置,可以用puts $errorInfo输出这个变量的值。

set命令

该命令可以用来创建、读取和修改,第一个参数是变量名,第二个参数如果有话,是变量的新值.

append命令

该命令用于在字符串的末尾添加一个字符,特点:因这是Tcl的内部表达式,处理起来速度快!

数组

数组是元素的集合,每一个元素有自己的名字和值的变量。包括两部分:数组名+数组中的元素名.下面是常见的两种数组定义方式:

方式一:set arrayName(element)方式

方式二: array set arrayName{} 方式

备注:

1. 在Tcl中数组是无序的数据结构(以哈希表的方式存储),而列表才是有序的排列.

2. 如果数组的元素包含空格,则需要用\转译,或变量替换

数组的相关命令

命令一: array names arrayName:返回指定数组的元素列表

命令二: array size arrayName: 数组中定义了多少个元素

命令三: array exists arrayName: 用于检验某个数组是否存在.

命令四: array set和array get: 后者是获取数组的字典

数组遍历: 一般用foreach来遍历数组,例如:

incr命令

该命令提供了改变变量值的简单方法.incr读入两个参数,分别是变量名和一个整数

8.5之前对不存在的变量,比如说上面的变量y,会报错!但在8.5及之后的版本,会创建该变量,默认+1.

unset命令和array
unset

unset命令用于销毁变量。可以接收多个变量,每个参数为变量名,也即意味着,一次可以删除多个变量,比如说:

array unset用于销毁数组:

预定义变量

Tcl库自动创建和管理了一些全局变量。最常用的部分如下:

1. argv0, argc, argv

2. env

3. tcl_platform

其他变量功能

tace命令: 用于监视变量,在变量设置、被读取、或被删除时调用指定的Tcl脚本。Trace命令在调试时很有用,该变量还允许创建只读变量,可以把变量跟踪用于“传播”,例如:只要变量值发生变化,数据库或屏幕上显示的值就即时更新。

global和upvar命令:可由过程使用,访问不由它所有的局部变量。

namespace命令:创建并管理命名空间,命名空间是命令和变量的命名集合。命名空间可以将命令和变量分隔开来,确保他们不会干扰其他命名空间中的命令和变量。

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

时间: 2025-01-02 15:06:55

Tcl学习之--语法|变量的相关文章

PHP学习笔记——入门篇(1)——语法&变量

基础 PHP 语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾: PHP 文件通常包含 HTML 标签以及一些 PHP 脚本代码. 注释:PHP 语句以分号结尾(;).PHP 代码块的关闭标签也会自动表明分号(因此在 PHP 代码块的最后一行不必使用分号). PHP 支持三种注释: //单行注释 #单行注释 /*多行注释*/ PHP 大小写敏感区分: 在 PHP 中,所有用户定义的函数.类和关键词(例如 if.else.echo 等等)都对大小写不

程序员带你学习安卓开发,十天快速入-对比C#学习java语法

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 上次课程:.程序员带你学习安卓开发,十天快速入门-开发工具配置学习讲的是java环境的配置以及as安装工具的安装. 其中有网友@鹅鹅鹅_说道,其实jdk的环境变量配置,不用配置的那么麻烦了.当前的jdk版本只要设置一个变量javahome就可以了,其他的可以不需要配置.在这里提一下.

VBA 开发学习--基础语法2

VBA中的运算符 算数运算符及其作用 + 求两个数的和 -  求两个数的差:求一个数的相反数 *  求两个数的积 /   求两个数的商(保留小数位   5/2=2.5) \   整除 (保留整数位  5\2=2) ^  指数运算(5^3=5*5*5=125) Mod  两数相除取余数  12 Mod 9=3 比较运算符 =   等于 <   小于 > 大于 <= 小于或等于 >= 大于或等于 <> 不等于 IS  比较两个对象的引用变量 Like   比较两个字符串是否

Go语言学习笔记(二) [变量、类型、关键字]

日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变量的类型在变量名的后面.例如:不是,int a,而是 a int.当定义了一个变量,它默认赋值为其类型的 null 值.这意味着,在 var a int后,a 的 值为 0.而 var s string,意味着 s 被赋值为零长度字符串,也就是 "". 3.Go语言的变量声明和赋值 在Go中使

1 TCL脚本基本语法(概要)

TCL常用基本语法 一个TCL脚本可以包含一个或多个命令.命令之间必须用换行符或分号隔开. 第一个单词代表命令名,另外的单词则是这个命令的参数,用空格或TAB键隔开. 变量置换$. 命令置换[] 反斜杠置换\ ,例如set msg multiple\ space ,如果没有\则有报警. 双引号将各种分隔符将不作处理,对换行符及$和[]两种置换符会照常处理. 花括号中所有特殊字符成为普通字符,失去其意义. 注释符 '#' $符号往后直到第一个不是字母.数字或下划线的字符之间的单词符号作为要被置换的

c++学习笔记:变量

c++学习笔记:变量(2) 先说明一下上一篇博文中的一个问题:char.signed char.unsigned char 这三者到底是怎么回事. signed char与unsigned char 是明确的拥有含义的,也就是说当定义了一个signed char那么这个char一定是有符号的整数类型.而当定义了一个unsigned char时这个char是明确无符号的整数类型.但是char却不一定了,它的行为依靠具体的实现.(“普通char究竟是有符号还是无符号,此事由实现确定.这也可能导致出现

PHP学习笔记——1.变量

目录: PHP学习笔记——1.变量 PHP学习笔记——1.常量 1.变量的组成 包括:变量名.变量值.存储地址 例:$a = 23; 执行后,在变量表中添加了$a这个变量名,在内存中开辟出一块空间,空间值为23,而$a指向23所在空间位置 例:echo $a; 执行后,先从变量表中找到$a,再根据其地址找到相应内存空间地址,读出23的值 2.变量的声明 $变量名 = 变量值; 3.变量名命名规范 字母.下划线.数字的组合 数字不能作为开头 区分大小写 4.变量的类型 ①五种标量: 整型:0 2

Swift编程语言学习——常量与变量

常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比如数字10或者字符串"Hello")关联起来.常量的值一旦设定就不能改变,而变量的值可以随意更改. 声明常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量.下面的例子展示了如何用常量和变量来记录用户尝试登录的次数: let maximumNumberOfLoginAttempts = 10 var currentLogin

学习html语法的规范性

不管学习什么语言第一开始都是在学习其语法规范,前端也不例外,首先我们讲解一下学习前端语言所使用的编辑器,现在在市面上大多使用的编辑器有:sublime     webstorm   HB等等,其实前端语言就算是使用简单的记事本也可以进行编辑,编辑器只是开发过程中的一种工具,我们主要考虑的是使用何种编辑器能够提高我们的开发效率.在这里我们以sublime为编辑器说明.其次我们讲解一下前端中html的语法特性:html是有各种的标签组成,html只在乎标签的嵌套结构,嵌套关系,谁嵌套谁,和换行.空格