1. 程式人生 > >Tcl學習之--語法|變數

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命令:建立並管理名稱空間,名稱空間是命令和變數的命名集合。名稱空間可以將命令和變數分隔開來,確保他們不會干擾其他名稱空間中的命令和變數。

相關推薦

Tcl學習--語法|變數

【語法|變數】 l 指令碼、命令和單詞 Tcl提供了大約100條命令,Tk提供了另外幾十條,指令碼包含一條或多條,通過換行符或分號分隔開. set a 12 set b 23 也可以寫成一行: se

Tcl學習--列表|字典

bsp 之間 索引 sof rst 匹配 產生 進行 而且 【列表|字典】 Tcl使用列表來處理各種集合,比方一個目錄中的全部文件,以及一個組件的全部選項。最簡單的列表就是包括由隨意個空格、制表符、換行符、分隔的隨意多個元素的字符串。比方: JerryAlice Man

Tcl學習--字符串

col sta http popu 模式 att font 註意 學習 【字符串操作】 Tcl的精髓在於對字符串的處理,非常多函數非常實用。特別是正則表達式。以下列出其經常使用的函數. l sting index: --> 索引 l sting rang

Django學習全域性變數

首先說說什麼叫全域性變數,我們經常在html中使用{{ var }}這樣的模板變數,這些變數是我們在檢視函式中 提前定義好的變數,通過render()等方法傳遞到模板中。 但是,還有一類變數,我們並沒有在views.py中定義,也能在html中使用該變數,像這樣的變數,就叫做 全域性變數。 下面來看看

theano學習Shared變數

Shared 變數,意思是這些變數可以在運算過程中,不停地進行交換和更新值。 在定義 weights 和 bias 的情況下,會需要用到這樣的變數。 import numpy as np import theano import theano.tensor as T #--

吳恩達機器學習變數線性迴歸實現部分

C++實現梯度下降法 “linear_regression.h” //多變數線性迴歸模型 struct elem_var2 { double y; double* x; //用陣列傳入自變數資料(x[0]=1,便於之後的計算) }; class var2

吳恩達機器學習變數線性迴歸理論部分

本部落格主要參考此部落格:戀雨心 一.Multiple Features — 多維特徵 相對於單變數線性迴歸模型,多變數線性迴歸模型適用於處理多個變數/特徵。 對比: 以之前我們介紹的單變數線性迴歸模型為例: 用房屋面積x預測房子價格y。 現在我們對房價模型增加更多的特徵,例如房間

吳恩達機器學習變數線性迴歸實現部分

C++實現 程式碼實現 “linear_regression.h” //單變數線性迴歸模型 struct elem_var1 { double x, y; //訓練集元素資料:自變數、因變數 }; class var1_lin_reg { p

吳恩達機器學習變數線性迴歸理論部分

理論部分 1.方程形式 在進行資料處理過程中,有時資料影象可擬合成單變數線性函式,即 2.如何擬合 此時,我們雖知道擬合函式的形式,但如何擬合仍是個問題,怎樣擬合可以最接近實際資料情況呢? 最小二乘法 此時我們引入代價函式這個概念 代價函式 接下來我們來分析如何

shell學習shell變數

shell指令碼 shell是一個用c語言編寫的程式,是使用者用來操作linux系統的語言,俗稱命令列。 我的第一個shell指令碼 新建一個文字,將其命名為test.sh。在文字中編寫程式碼: #!/bin/bash echo “hello wang” 在test.s

記錄Python學習路----------------變數及簡單資料型別

在開頭先說明Python3在geany下關於中文註釋和中文程式碼,在開始一個Python程式時,在程式開頭輸入以下程式碼, #-*-coding:utf-8-*- #-*-coding:GBK-*- print("你好,Python!") 就像上圖程式碼所示。還要記住Py

matlab學習persistent變數的使用

 persistent Define persistent variable.     persistent X Y Z defines X, Y, and Z as variables that are local      to the function in which they are declare

Python學習路-----變數的引用

基本資料型別的引用        在Python中定義一個數據便在記憶體中開闢一片空間來儲存這個變數的值,這塊已經被分配的記憶體空間便會有一個記憶體地址。訪問這塊記憶體需要用到變數名,變數名實際儲存的是變數的地址在記憶體中的地址,但是使用print()函式得到的確實這塊記憶體

機器學習——多變數線性迴歸

在之前的部落格中,描述過單變數線性迴歸(Linear Regression with One Variables)的模型,這次來分享一下多變數線性迴歸模型(Linear Regression wit

matlab學習persistent變數、isempty()函式的使用

1.persistent 作用:定義persistent變數; 用法:persistent X Y Z 注: (a) 將在函式中宣告的區域性變數儲存到記憶體中,供以後呼叫該函式使用。定義的變數類似全域性變數會一直存在記憶體中,但不同的是persistent變數只能被所被定

C++學習變數的儲存類別

在c++中,每個變數有兩個屬性:型別:變數所儲存的資料型別(如int、double、char);儲存型別:變數所儲存的區域(atuo、register、extern、static)變數的作用域決定了變數的有效範圍。變數的儲存類別決定了變數的生存期限。在計算機中,記憶體被分成不

Python學習路-變數、字串、函式

目錄 變數和型別 條件判斷 迴圈控制 函式 變數和型別 基本變數型別 整數 浮點數 字串 布林值 空值 函式 模組 型別* 自定義型別 變數定義  變數儲存在記憶體中的值。這就意味著在建立變數時會在記憶體中開闢一個空間。 基於變數的資料型別,

機器學習變數線性迴歸(Linear Regression with One Variable)

1. 模型表達(Model Representation) 我們的第一個學習演算法是線性迴歸演算法,讓我們通過一個例子來開始。這個例子用來預測住房價格,我們使用一個數據集,該資料集包含俄勒岡州波特蘭市的住房價格。在這裡,我要根據不同房屋尺寸所售出的價格,畫出我的資料集: 我們來看這個資料集,如果你有一個朋

TCL學習info命令

這篇文章主要講一下info指令的相關用法。 1.info命令列表 該命令使用的匹配式規則和string match 一致,並且如果不適用匹配式,返回所有的項。 序號 命令 描述 1 info comm

JavaScript的學習區域性變數和區域性函式

JavaScript-區域性變數和區域性函式 一、區域性變數和全域性變數 首先,我們先來了解一下區域性變數和全域性變數的定義 區域性變數:在函式內,使用var定義的變數 全域性變數:在函式外定義的變數和在函式內不使用var定義的變數 需要注意的是: 如果區域性