语法|变量

脚本、命令和单词

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个button事件 分别为 .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命令:创建并管理命名空间,命名空间是命令和变量的命名集合。命名空间能够将命令和变量分隔开来,确保他们不会干扰其它命名空间中的命令和变量。

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

  1. golang语法学习(一):变量,常量以及数据类型

    学习一门新的语言肯定是要从他的主要的语法開始,语法构成了整个程序设计的基础,从语法中我们也能够看到这门语言的一些特性.可是话说回来.语法这东西,不同的语言大同小异,所以这也对语法的记忆造成了一定的难度 ...

  2. ios -- 教你如何轻松学习Swift语法(一)

    目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类 ...

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

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  4. ES6学习笔记之变量的解构赋值

    变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...

  5. Swift入门学习之一常量,变量和声明

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...

  6. Python入门学习:1.变量和简单的数据类型

    python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用   变量,顾名思义是一个可变的量, ...

  7. Shell学习之环境变量配置文件(三)

    Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的 ...

  8. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  9. NodeJS学习:环境变量

    简介 环境变量(environment variables) 不属于 NodeJS 范畴,它是操作系统用于设定执行环境的参数.会在程序运行时传递给应用程序. NodeJS 获取环境变量,是通过 glo ...

随机推荐

  1. html5 OPOA

    1.0 one page one application     一个应用只有一个页面,对用户的表现来说的. 2.0 起源于web的MIS系统     MIS(管理信息系统) 3.0 银行客户端 4. ...

  2. vs2008调试 Release(链接器来生成调试信息)

    VS2008 Release 修改配置: 1.项目——>属性——>C/ C++ ——> 常规 ——>调试信息格式——>用于“编辑并继续”的程序数据库(/ZI) 2.项目— ...

  3. 设置windows窗口半透明(使用SetLayeredWindowAttributes API函数)

    所需函数原型:BOOL WINAPI SetLayeredWindowAttributes(HWND hWnd,  COLORREFcrKey,  BYTE bAlpha,  DWORD flag); ...

  4. 编写最简单的 iPhone 界面切换应用

    编写最简单的 iPhone 界面切换应用   以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建 ...

  5. #include <limits.h>

    limits.h专门用于检测整型数据数据类型的表达值范围. #include<stdio.h> #include<limits.h> main() { printf(" ...

  6. Hibernate的介绍

    1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等. 而且Hiber ...

  7. Sizzle之tokenize

    在Sizzle里,大体思路,当为复合选择器时,判断是否支持querySeletorAll,如果不支持则调用自写方法select. select的功能十分冗长,下面先分析tokenize 在tokeni ...

  8. utf8+bom格式保存php curl乱码问题

    今天开发遇到一个php curl取数据乱码问题 不是gzip也不是编码设置问题 最后有一同事判断为utf8+bom保存数据原因,懒得深入了解utf8+bom,仅做记录 [root@centos5 ~] ...

  9. js 控制台的错误提示

    错误:程序运行过程中发生的异常状态 导致程序停止运行——异常 错误处理:当程序发生错误时,保证程序不退出的机制 发生错误时,程序会自动创建一个Error对象: Error对象中仅封装了错误的信息 js ...

  10. linux创建用户和组

    linux下创建用户(一) Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系 ...