Tclコマンド編

 「使える」変数
 Tclの変数の「型」はすべて文字列です。従って「型宣言」もありません。(型はありませんがスコープはあります)
 例えば、数値計算はコマンドの内部処理の過程で、数値化されます。また、各変数の領域は動的に必要な分だけ取られます。
 変数は扱いによって、以下の2種類に分類されます。
  スカラー変数   任意の文字列からなる変数。
例) >set msg "Hello !"
>set msg
Hello !
>puts "$msg Worlds"
Hello ! Worlds
  配列変数   配列名と要素名からなる変数。両者とも任意の文字列からなり、要素をかっこ{()}で括る。
要素名を任意の文字列で指定できることから、「連想配列」と呼ばれる。
例) >set msg(morning) "Good Morning!"
>set msg(GotoBed) "Oyasumi"
>set msg(morning)
Good Morning!
>set msg
can't read "msg": variable is array
 Tclインタプリタは解析の段階で、ドルマーク($)に続き、英数字およびアンダースコア(_)の手前までを変数名として、変数置換します。
  >set msg Ohayou
>set msg_2 Konbanwa
>set {msg ex. blank} "Konnitiwa "
>puts $msg
Ohayou
>puts $msg_2=Samuidesune
Konbanwa=Samuidesune
>puts ${msg ex. blank}Atuidesune
Konnitiwa Atuidesune

>set arr(aisatu,thank) "Arigato "
>set arr(aisatu,what) "??? "
>puts $arr(aisatu,thank)$arr(aisatu,what)
Arigato ???

変数名は、「msg」
変数名は、「msg_2」
変数名は、「msg ex. blank」
$ 以降、改行の手前までが変数名として認識される。
同様に、= の手前まで。

ブレースで囲むことで、空白のクォートおよび続く英字と分割されている。

配列名 arr 要素名 aisatu,thank
同じく、要素名 aisatu,what
2つの配列変数が、$ で分割されている。

 これらの変数を扱うコマンドが、set unset array です。
  set 変数の作成と参照をします。
set varName ?value?
varName 変数名。ドルマークの扱いに注意すること。
$ を付けると、変数置換後の文字列が渡されます。
?value? 変数に設定する任意の文字列。両脇の?は、省略可能の意味です。
省略すると参照になります。ただし、返値が変数の値であるため、作成時に参照もできます。
  unset 1つ以上の変数を削除します。
unset name ?name name ...?
name 削除したい変数名。
例) >set msg "こんにちは"
こんにちは
>set week(mon) "Monday"
Monday
>set week(1) "Monday"
Monday
>unset msg week(mon)
>array names week
1
スカラー変数へ定義

配列変数へ定義



配列変数の場合、全体も一部も可
  array set コマンドで作成された配列を操作します。
array option arrayName ?arg arg ...?
option 操作オプション。names get exists 等。
arrayName 配列変数名。
?arg arg ...? 操作オプションごとの引数。
例) >array exists week
0
>set week(mon) Monday
>set week(tue) Tuesday
>set week(thu) Thursday
>array exists week
1
>array names week
tue mon thu
>array get week t*
tue Tuesday thu Thursday
配列変数 week の有無は?
存在しない。
配列変数を作成。


配列変数 week の有無は?
存在する。
配列変数 week の要素は?
tue mon thu の3つ。(順不同)
要素名 t で始まる要素の情報は?
要素名 値 …
 スクリプト言語の真髄「文字列操作」
 スクリプト言語は文字列による処理系のため、それを操作するためのコマンドが豊富にあります。
 次のスクリプトをコピー&ペーストしてから、str_test1と入力すると文字列が表示されます。
 また、str_test2と入力した後、ルートウィンドウの入力域に何か文字を入れて、<Enter>キーを叩くと文字列が加工されてコンソールウィンドウに表示されます。
 
proc str_test1 {} {
  set word_1 to;
  set word_2 be;
  set word_3 or;
  set word_4 not;
  set word_5 that's;
  set word_6 the;
  set word_7 question;
  set word_8 .;
  append dialogue [string totitle $word_1];
  append dialogue " $word_2";
  append dialogue [format { %s %s %s %s } $word_3 $word_4 $word_1 $word_2];
  append dialogue " [string totitle $word_5] $word_6 $word_7$word_8";
  puts $dialogue;
}

proc str_test2 {} {
  catch {destroy .e};
  entry .e;
  place .e -x 10 -y 10;
  puts "Please Input Strings!";
  bind .e <Return> {str_test3};
}

proc str_test3 {} {
  set wk [.e get];
  if { [string compare $wk EOF] == 0 } {
    puts "Thank you and see you next!";
    destroy .e;
  } {
    puts [format {%s : %s} Inputted $wk];
    puts [format {%s : %s} ToUpper [string toupper $wk]];
    puts [format {%s : %s} ToLower [string tolower $wk]];
    puts [format {%s : %s} ToTitle [string totitle $wk]];
    puts [format {%s : %s} Length  [string length  $wk]];
  }
}
 以下に簡単なシンタックスを記載します。
  string 文字列の各種操作を行います。
string option arg ?arg ...?
option 操作オプション。compare、length、match、range、trim等。
?arg arg ...? 操作オプションごとの引数。
例) >set wk1 "I wish I were a bird."
>set wk2 "i wish i were a bird."
>string trim $wk1 I
wish I were a bird.
>string compare [string tolower $wk1] $wk2
0
>string match "I wish*" $wk1
1


左右から、I を取り除きます。
一番左に空白があることに注意!
小文字にして比較
同じ。
パターンマッチングも可。
結果は真。
  append 変数に文字列を追加します。
append varName ?value..?
varName 変数名。あれば追加し、無ければ作成します。
?value..? 追加する文字列。複数指定も可。
例) >set wk
can't read "wk": no such variable
>append wk I wish I we
>set wk
IwishIwe
>append wk "re a bird."
>set wk
IwishIwere a bird.
変数 wk を参照すると、
存在しない。
4つの文字列 I wish I wereを追加
再度 wk を参照すると、
作成されている。
さらに、文字列を追加して、
参照してみると、
文字列が追加されている。
  format 文字列を書式に従って成形する。
format formatString ?arg arg ...?
formatString 書式。C言語の sprintf 関数に準拠しています。ただし、
%p と %n 変換は未サポート。
%c 変換は 10進の文字列のみ。
l 修飾子は無視されます。
?arg arg ...? 書式に対応する文字列。
例) >set wk1 100
>format {%s %10.2f%%} "Power" $wk
Power 100.00%
変数に文字列を設定する。
書式に従って成形。
結果の文字列。
  scan 文字列から書式に従って文字列をパースする。format の逆。
scan string format varName ?varName ...?
string 取り出し元の文字列。
format 書式。ただし、
%p と %n 変換は未サポート。
%c 変換は 1文字の文字コードが 10進文字列に変換後、varName へ代入
また、フィールド幅指定不可
l、 h、 L 修飾子は無視されます。
varName パースした文字列を格納する変数名。
例) >set wk "abc 100XYZ"
>scan $wk {%3s%4d%s} str1 str2 str3
>puts "$str1;$str2;$str3"
abc;100;XYZ
元文字列を設定する。
取り出し。
それぞれ書き出してみる。
「 100」で無いことに注意!