tcl腳本expr-ag真人国际官网
⑴ tcl編程的語法規則
tcl的語法規則:
1、解釋器
在tcl的數據結構中的核心是tcl_interp.一個解釋器包含了一套命令,一組變數和一些用於描述狀態的東西。每一個 tcl命令是 在特定的tcl_interp中運行的,基於tcl的應用程序可以同時擁有幾個tcl_interp。tcl_interp是一個輕量級的結構,可以快速的新建和刪除。
2、數據類型
tcl只支持一種數據結構:字元串(string)。所有的命令,命令的所有的參數,命令的結果,所有的變數都是字元串。請牢記這一點,所有的東西都是字元串。這是它比較有特點的方面字元串有三種形式:命令(command),表達式(expresion)和表(list)。
3、basic command syntax 基本語法
tcl有類似於shell和lisp的語法,當然也有許多的不同。一 條tcl的命令串包含了一條或多條命令用換行符或分號來隔開,而每一條命令包含了一個域(field)的集合,域使用空白分開的,第一個域是一個命令的名字,其它的是作為參數來傳給它。
例如:
set a 22 //相當於c中的 a=22 a是一個變數這條命令分為三個域:1:set 2:a 3:22 set使用於設置變數的值的命令,a、20 作為參數來傳給它,a使它要操作的變數名,22是要付給的a值。
tcl的命令名可以是內置的命令也可以是用戶建的新命令,如果是用戶用戶建的新命令應用程序中用函數tcl_createcommand來創建。所有的參數作為字元串來傳遞,命令自己會按其所需來解釋的參數的。命令的名字必須被打全,但 tcl解釋器找不到一同名的命令時會用 unknown命令來代替。
在很多場合下,unknown 會在庫目錄中搜尋,找到一個的話,會自動生成一個tcl命令並調用它。unknown經常完成縮略的命令名的執行。但最好不要使用。
4、注釋
和shell很象,第一個字母是"#"的tcl字元串是注釋。
其他細節規則
grouping arguments with double-quotes 用雙引號來集群參數,目的在於使用有空白的參數。
例如:
set a "this string contains whitespace"
如果一個參數一雙引號來開始,該參數會一直到下一個雙引號才結束。其中可以有換行符和分號。
variable substitution with $ 用美元符進行變數替換說白了就是引用該變數。
例如:
set a hello
set b $a // b = "hello" 實際上傳給set命令的參數
//是b,"hello"
set c a // b = "a"
command substitution with brackets 命令子替換(用方括弧)
例如:
set a [set b "hello"]
實現執行 set b "hello" 並用其結果來替換源命令 中的方括弧部分,產生一條新命令
set a "hello" //"hello" 為 set b "hello" 的返回值
最終的結果是b="hello" a="hello"
當命令的一個子域以方括弧開始以方括弧結束,表示要進行一個命令子替換。並執行該子命令,用其結果來替換原命令中的方括弧部分。方括弧中的部分都被視為tcl命令。
如下一個復雜一點的例子:
set a xyz[set b "abc"].[set c "def"]
//return xyzabcdef
backslash substitution 轉移符替換
轉移符時間不可列印字元或由它數意義的字元插入進來。這一概念與c語言中的一樣。
backspace (0x8).
f form feed (0xc).
newline (0xa).
carriage-return (0xd).
tab (0x9).
v vertical tab (0xb).
{ left brace (`{").
} right brace (`}").
[ open bracket (`[").
] close bracket (`]").
$ dollar sign (`$").
sp space (` "): does not terminate argument.
; semicolon: does not terminate command.
" double-quote.
grouping arguments with braces 用花擴括弧來集群參數
用花擴括弧來集群參數與用雙引號來集群參數的區別在於:用花擴括弧來集群參數其中的三種上述的子替換不被執行。而且可以嵌套。
例如:
set a {xyz a {b c d}}//set收到兩個參數 a "xyz a {b c d}"
eval {
set a 22
set b 33
}//eval收到一個參數 "set a 22
set b 33"
5、命令綜述
1.一個命令就是一個字元串(string)。
2.命令是用換行符或分號來分隔的。
3.一個命令由許多的域組成。第一個於是命令名,其它的域作為參數來傳遞。
4.域通常是有空白(tab橫向製表健 space空格)來分開的。
5.雙引號可以使一個參數包括換行符或分號。三種子替換仍然發生。
6.花括弧類似於雙引號,只是不進行三總體換。
7.系統只進行一層子替換,機制替換的結果不會再去做子替換。而且子替換可以在任何一個域進行。
8.如果第一個非控字元是`#",這一行的所有東西都是注釋。
6、表達式
對字元串的一種解釋是表達式。幾個命令將其參數按表達式處理,如:expr、for 和 if,並調用tcl表達式處理器(tcl_exprlong,tcl_exprboolean等)來處理它們。其中的運算符與c語言的很相似。
!
邏輯非
* / % -
< >>
左移 右移 只能用於整數。
> = == !=
邏輯比較
& ^ |
位運算和 異或 或
&&''
邏輯"和" "或"
x y : z
if-then-else 與c的一樣
tcl 中的邏輯真為1,邏輯假為0。
一些例子:
5./ 4.0
5./ ( [string length "abcd"] 0.0 )
計算字元串的長度 轉化為浮點數來計算
"0x03" > "2"
"0y" < "0x12"
都返回 1
set a 1
expr $a 2
expr 1 2
都返回 3
⑵ tcl語言的變數
不像c,tcl的變數在使用前不需要聲明。tcl的變數在它首次被賦值時產生,使用set命令。變數可以用unset命令刪除,雖然並不強制需要這樣做。
變數的值通過$符號訪問,也叫變數交換。
tcl是一個典型的」弱類型定義」語言,這意味者任何類型可以存儲在任何變數中。例如,同一個變數可以存儲數字,日期,字元串甚至另一段tcl script.
example 1.1:
set foo john
puts hi my name is $foo
output: hi my name is john
example 1.2:
set month 2
set day 3
set year 97
set date $month:$day:$year
puts $date
output: 2:3:97
example 1.3:
set foo puts hi
eval $foo
output: hi
在這個例子里,變數foo存儲了另外一段tcl script.
表達式
包括數學表達式,關系表達式,通常用 expr命令。
example 2.1:
expr 0 == 1
output: 0
example 2.2:
expr 1 == 1
output: 1
兩數比較,true則輸出1,false輸出0
example 2.3:
expr 4 5
output: 9
example 2.4:
expr sin(2)
output: 0.909297
命令傳遞
以運算結果替代tcl命令中的部分
example 3.1:
puts i am [expr 10 * 2] years old, and my i.q. is [expr 100 - 25]
output: i am 20 years old, and my i.q. is 75
方括弧是命令傳遞的標志
example 3.2:
set my_height 6.0
puts if i was 2 inches taller, i would be [expr $my_height (2.0 / 12.0)] feet tall
output: if i was 2 inches taller, i would be 6.16667 feet tall
命令流控制
tcl有判斷流轉(if-else; switch)和循環控制(while; for; foreach)
example 4.1:
set my_planet earth
if {$my_planet == earth} {
puts i feel right at home.
} elseif {$my_planet == venus} {
puts this is not my home.
} else {
puts i am neither from earth, nor from venus.
}
set temp 95
if {$temp < 80} {
puts it's a little chilly.
} else {
puts warm enough for me.
}
output:
i feel right at home.
warm enough for me.
example 4.2:
set num_legs 4
switch $num_legs {
2 {puts it could be a human.}
4 {puts it could be a cow.}
6 {puts it could be an ant.}
8 {puts it could be a spider.}
default {puts it could be anything.}
}
output:
it could be a cow.
example 4.3:
for {set i 0} {$i < 10} {incr i 1} {
puts in the for loop, and i == $i
}
output:
in the for loop, and i == 0
in the for loop, and i == 1
in the for loop, and i == 2
in the for loop, and i == 3
in the for loop, and i == 4
in the for loop, and i == 5
in the for loop, and i == 6
in the for loop, and i == 7
in the for loop, and i == 8
in the for loop, and i == 9
example 4.4:
set i 0
while {$i < 10} {
puts in the while loop, and i == $i
incr i 1
}
output:
in the while loop, and i == 0
in the while loop, and i == 1
in the while loop, and i == 2
in the while loop, and i == 3
in the while loop, and i == 4
in the while loop, and i == 5
in the while loop, and i == 6
in the while loop, and i == 7
in the while loop, and i == 8
in the while loop, and i == 9
example 4.5:
foreach vowel {a e i o u} {
puts $vowel is a vowel
}
output:
a is a vowel
e is a vowel
i is a vowel
o is a vowel
u is a vowel
proceres
⑶ tcl 語法基礎
注釋:
puts {hello, world - in braces}; # 這種注釋方式才是正確的
puts {bad comment syntax example} # *error* - there is no semicolon!這是一個錯誤,因為tcl的語法規定,命令的參數結束的方式為;或者新的一行
變數:
初始化一個變數用set關鍵字:
# set關鍵字可以接受兩個參數:並返回第一參數(也就是變數名)的內容(第二個參數)
#set關鍵字也可以接受一個參數,如果只接受一個參數的時候返回這個變數的內容
set x 10 # 定義變數x的值為10
set y x 100 # 定義變數y的值為 x 100 這里會把x 100 看成整體的一個字元串,這里可以看出tcl默認都認為是字元串來出來
set y $x 100 # 定義變數y的值為 10 100 ,這里$符號告訴解釋器x是一個變數而不是字元串
set y [expr $x 100] # 定義變數y的值為110,當tcl解釋器遇到[] 的時候會去執行裡面的內容並返回結果。
set y "$x ddd" # 這里雙引號的作用是允許這個字元串中有空格
set y {$x 10} # 這里的x不會被解釋,所以{}的作用是,直接定義 一整串字元串
puts:轉義符
set z albany
set z_label "the capitol of new york is: "
puts "$z_label $z" ;# prints the value of z
puts "$z_label \$z" ;# prints a literal $z instead of the value of z
puts "\nben franklin is on the \$100.00 bill"
set a 100.00
puts "washington is not on the $a bill" ;# this is not what you want
puts "lincoln is not on the $$a bill" ;# this is ok
puts "hamilton is not on the \$a bill" ;# this is not what you want
puts "ben franklin is on the \$$a bill" ;# but, this is ok
puts "\n................. examples of escape strings"
puts "tab\ttab\ttab"
puts "this string prints out \non two lines"
puts "this string comes out\
on a single line"
數組:
set a [list 1 2 3 4] # 初始化一個列表
lappend a 5 # 追加一個變數,注意這里的列表a沒有加$
lindex $a 1 # 獲取列表第二值,這里加上了$
llength $a # 返回列表的長度
lrange $a 0 2 # 返回前三個數這里取到了第三個值
字元串格式化:
set name john
set age 20
set msg [format "%s is %d years old" $name $age] # 格式化
puts $msg