您的位置:首页 > 其它

Tcl -- set/置换(subtitution)

2016-02-16 15:25 363 查看
Tcl -- 置换(subtitution)

Tcl解释器在分析命令时,把所有的命令参数都当作字符串看待。

% set x 10; #定义变量x,并给x赋值为10
10
% set y x+100; #y的值是x+100,而不是我们预想的10+100
x+100

三种形式的置换:变量置换, 命令置换, 反斜杠置换

每种置换都会导致一个或多个单词本身被其他的值所代替。

1)变量置换(variable subtitution)由$符号标记

% set x 10;
% set y $x+100; #y的值是10+100,这里x被置换成它的值10
10+100

这时,y的值还不是110,而是10+100。

因为Tcl解释器把10+100看成是一个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得Tcl把10+100看成一个表达式并求值。

2)命令置换(command subtitution)

命令置换是由 [ ] 括起来的TCL命令及其参数,命令置换会导致一个命令的所有或部分单词被另一个命令的结果所代替。

% set y [expr $x+100]
110

y的值是110,当Tcl解释器遇到字符 ' [ ' 时,它会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程。

如果去掉 [ ] ,Tcl会报错。因为在正常情况下,TCl解释器只把命令行中的第一个单词看作命令,其他单词都作为普通字符串处理,看作是命令的参数。

注意:[ ] 中脚本的值为最后一个命令的返回值。

% set y [expr $x+100;set b 300];
300
#y的值是300,因为set b 300的返回值是300

有了命令置换,表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。

[yanxia.dong@eslruntime07 ~]$ tclsh
% set a 2
2
% set a.1 4
4
% set b $a.1
2.1
% set c ${a.1}
4
% set c #只有一个参数的set 命令读取c 的当前值
4
% puts a
a
% puts $c
4
% set nonec {$a 2\n3}
$a 2\n3
% set charat "$a 2\tx"
2 2	x
3)反斜杠置换(backslash subtitution)

Tcl语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被Tcl解释器当作特殊符号对待的字符。

% set msg multiple\ space;
# msg的值为multiple space,反斜杠\ 表示空格。

如果没有'\',TCL会报错,会认为空格是参数的分隔符,于是发现set命令有多于两个参数,从而报错。

加入'\'后,空格不被当作分隔符,而就是空格。

反斜杠序列

\a 响铃符

\b 退格

\n 换行符 new line

\r 回车 carriage return

\t Tab

\v vertical tab

\ddd Octal value given by ddd 八进制值

\xhh Hex value given by hh 十六进制

双引号""和花括号{}

除了使用反斜杠外,Tcl提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号" "和花括号{}

1)Tcl解释器对 “ ” 中的各种分隔符(空格)将不作处理,但是对\r, \t, \v, \ddd, \xhh, 换行符\n等反斜杠置换 及$, [ ]两种置换符会照常处理。

即会对以上的三种置换会进行处理,对于空格保持原样。

% set x 100
100
% set y "$x ddd";#对空格不作处理
100 ddd
% set str "you are\ra good\v boy."
a good
       boy.
% set x "you\r are\t a good girl."
 are  a good girl.
% set p "The number is \x43."
The number is C.
% set num "This number is \141."
This number is a.
% set c "It is\r a novel book.\nIsn't it?"
 a novel book.
Isn't it?
% set a "I like\b you and\v your sister."
I lik you and
              your sister.

2)在花括号{  }中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。

% set y {/n$x [expr 10+100]}
/n$x [expr 10+100]

举例说明

% set  a 100
100
% set msg good\ luck
good luck
% set msg "goog luck"
goog luck
% set msg "good $a luck [expr $a+100]"
good 100 luck 200
% set msg "good $a \nluck [expr $a+100]"
good 100
luck 200
% set msg {good $a \nluck [expr $a+100]}
good $a \nluck [expr $a+100]
% set a {expr 100+200}
expr 100+200
% set b {the bird is funny\n.}
the bird is funny\n.
# 由此可以看出命令对""中的三种置换符号($,[],\)是做了处理的,但是对{}中的特殊符号则不作任何处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  置换