Tcl学习之--语法|变量
【语法|变量】
l 脚本、命令和单词
Tcl提供了大约100条命令。Tk提供了另外几十条,脚本包括一条或多条,通过换行符或分号分隔开.
set a 12
set b 23
也能够写成一行: set a 12; set b 23
每一个命令由多个单词组成,以空格来分隔。首字母为命令名。所以:
1. set -> 单词,同一时候也是命令名
2. a -> 单词
3. 12 -> 单词,将该值赋予a
l 处理命令
Tcl处理命令分两步: 解析和运行
1) 在解析阶段。Tcl进行一系列简单字符串操作,比方将$input变量中存放的input字符串来取代
2) 在运行阶段,命令中的各个单词有了详细含义。
Tcl把第一个单词作为命令名称,并依据传递过来的參数,运行该命令。
图演示样例如以下:
l 替换
方式一:变量替换
例1: 计算或赋值
例2: 创建4个button事件 分别为 .b1,.b2, .b3, .b4
% foreach num {1 2 3 4} { button.b$num }
备注:
替换不影响命令中每一个单词的切割。即使替换后的字符包含空格,制表符,换行符,等空白字符,也不影响。
方式二: 命令替换
备注:
命令替换是把一个单词的部分或所有替换为一个命令的结果,通过[]来进行,会调用[]中的命令,比方上面的expr命令.
方式三: 反斜杠替换
用于向单词中插入像\n、[、$、空格符这样会被Tcl解析器觉得有特殊含义的字符。例如以下所看到的:
备注:
反斜杠替换和一般的替换不同。这样的替换在Tcl解释器解释命令前就要单独进行,这意味着用于替换空格符会被作为单词分隔符看待。除非它们被””或{}括起来.
l 双引號引用
Tcl中提供了一些方法,能够阻止解析器对$和分号等字符进行处理,这些方法称为引用。
例1: 要将hello world赋给msg。不用双引號的话会报错.
这个时候就须要引用:
例2: 将空格、制表符、换行以及分号做普通字符处理.
例3: 将msg设置为包括一个变量名,该变量平方等信息的字符串
l 大括号引用
假设说双引號对\n还会做特殊处理的话,那么大括号则是更彻底的引用形式,它会取消当中全部特殊字符的特殊意义。全部的空格。制表符,换行符以及分号都会作为普通字符处理。
例1: 将上面msg信息如实打印出来
l 參数展开
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
l 凝视
假设一条命令的第一个非空白字符是#。那么这一行将被视为凝视。
注意:凝视符必须出如今Tcl预期将获得命令的第一个字符位置上。假设凝视出如今其它地方,会被看作一个普通字符,看成一个命令单词的一部分。
第二行#出如今一条命令中间,导致该set命令接收到3个參数,所以错误。最后一个#被视为凝视符是由于它紧接在标志一条命令终止的;后面。要准确理解上面标红的意思,再看以下两个样例。
例1: {}中非凝视的情况
{}中的全部字符被视为一个參数。作为字符串赋给set指定的变量,所以不是凝视!
例2: {}中凝视的情况
这里面有两个{},if命令会把第一个{}视为boolean型表达式处理,假设为真的话,它会调用Tcl解释器将第二个參数作为Tcl脚本处理。在Tcl解析器再次进行解析时,以#开头的第一行才被识别为凝视。
例3: 出如今凝视中的大括号常导致错误
第二种用途,用if命令来将多行凝视。看以下样例.
在Java中能够用
/*
*/
在Python中用三个单引號对,或三个双引號对来多行凝视。
Tcl中能够用if 命令来达到相同的效果: 多行凝视的问题。
If 0,即条件为假,以下的分支就不走了。从而达到凝视的目的。
l errorInfo
异常返回的时候,错误信息会保存在全局变量errorInfo中,
出现错误后,Tcl会把errorInfo设置为一个栈,保存产生错误的确切位置,能够用puts $errorInfo输出这个变量的值。
l set命令
该命令能够用来创建、读取和改动,第一个參数是变量名,第二个參数假设有话,是变量的新值.
l append命令
该命令用于在字符串的末尾加入一个字符。特点:因这是Tcl的内部表达式,处理起来速度快!
l 数组
数组是元素的集合,每个元素有自己的名字和值的变量。
包含两部分:数组名+数组中的元素名.以下是常见的两种数组定义方式:
方式一:set arrayName(element)方式
方式二: array set arrayName{} 方式
备注:
1. 在Tcl中数组是无序的数据结构(以哈希表的方式存储),而列表才是有序的排列.
2. 假设数组的元素包括空格,则须要用\转译。或变量替换
l 数组的相关命令
命令一: array names arrayName:返回指定数组的元素列表
命令二: array size arrayName: 数组中定义了多少个元素
命令三: array exists arrayName: 用于检验某个数组是否存在.
命令四: array set和array get: 后者是获取数组的字典
数组遍历: 一般用foreach来遍历数组,比如:
l incr命令
该命令提供了改变变量值的简单方法.incr读入两个參数,各自是变量名和一个整数
8.5之前对不存在的变量。比方说上面的变量y,会报错。但在8.5及之后的版本号。会创建该变量,默认+1.
l unset命令和array
unset
unset命令用于销毁变量。能够接收多个变量。每一个參数为变量名,也即意味着,一次能够删除多个变量,比方说:
array unset用于销毁数组:
l 提前定义变量
Tcl库自己主动创建和管理了一些全局变量。最经常使用的部分例如以下:
1. argv0, argc, argv
2. env
3. tcl_platform
l 其它变量功能
tace命令: 用于监视变量。在变量设置、被读取、或被删除时调用指定的Tcl脚本。Trace命令在调试时非常实用,该变量还同意创建仅仅读变量,能够把变量跟踪用于“传播”,比如:仅仅要变量值发生变化,数据库或屏幕上显示的值就即时更新。
global和upvar命令:可由过程使用,訪问不由它全部的局部变量。
namespace命令:创建并管理命名空间,命名空间是命令和变量的命名集合。命名空间能够将命令和变量分隔开来,确保他们不会干扰其它命名空间中的命令和变量。
Tcl学习之--语法|变量的更多相关文章
- golang语法学习(一):变量,常量以及数据类型
学习一门新的语言肯定是要从他的主要的语法開始,语法构成了整个程序设计的基础,从语法中我们也能够看到这门语言的一些特性.可是话说回来.语法这东西,不同的语言大同小异,所以这也对语法的记忆造成了一定的难度 ...
- ios -- 教你如何轻松学习Swift语法(一)
目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类 ...
- 程序员带你学习安卓开发,十天快速入-对比C#学习java语法
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- ES6学习笔记之变量的解构赋值
变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...
- Swift入门学习之一常量,变量和声明
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...
- Python入门学习:1.变量和简单的数据类型
python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用 变量,顾名思义是一个可变的量, ...
- Shell学习之环境变量配置文件(三)
Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的 ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
- NodeJS学习:环境变量
简介 环境变量(environment variables) 不属于 NodeJS 范畴,它是操作系统用于设定执行环境的参数.会在程序运行时传递给应用程序. NodeJS 获取环境变量,是通过 glo ...
随机推荐
- html5 OPOA
1.0 one page one application 一个应用只有一个页面,对用户的表现来说的. 2.0 起源于web的MIS系统 MIS(管理信息系统) 3.0 银行客户端 4. ...
- vs2008调试 Release(链接器来生成调试信息)
VS2008 Release 修改配置: 1.项目——>属性——>C/ C++ ——> 常规 ——>调试信息格式——>用于“编辑并继续”的程序数据库(/ZI) 2.项目— ...
- 设置windows窗口半透明(使用SetLayeredWindowAttributes API函数)
所需函数原型:BOOL WINAPI SetLayeredWindowAttributes(HWND hWnd, COLORREFcrKey, BYTE bAlpha, DWORD flag); ...
- 编写最简单的 iPhone 界面切换应用
编写最简单的 iPhone 界面切换应用 以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建 ...
- #include <limits.h>
limits.h专门用于检测整型数据数据类型的表达值范围. #include<stdio.h> #include<limits.h> main() { printf(" ...
- Hibernate的介绍
1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等. 而且Hiber ...
- Sizzle之tokenize
在Sizzle里,大体思路,当为复合选择器时,判断是否支持querySeletorAll,如果不支持则调用自写方法select. select的功能十分冗长,下面先分析tokenize 在tokeni ...
- utf8+bom格式保存php curl乱码问题
今天开发遇到一个php curl取数据乱码问题 不是gzip也不是编码设置问题 最后有一同事判断为utf8+bom保存数据原因,懒得深入了解utf8+bom,仅做记录 [root@centos5 ~] ...
- js 控制台的错误提示
错误:程序运行过程中发生的异常状态 导致程序停止运行——异常 错误处理:当程序发生错误时,保证程序不退出的机制 发生错误时,程序会自动创建一个Error对象: Error对象中仅封装了错误的信息 js ...
- linux创建用户和组
linux下创建用户(一) Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系 ...