Tclコマンド編

 その他のコアコマンド
 ここでは、Tclで用意されているその他のコアコマンドを紹介します。
 では、次のスクリプトをコンソールにコピー&ペーストして確かめてみてください。
 
# -- after, clock の例 --                            
proc proc_etc1 { cnt } {
  incr cnt;
  puts [clock format [clock seconds] -format %T];
  if { $cnt < 3 } {
    after 1000 proc_etc1 $cnt;
  } {
    puts "End.";
  }
};
proc_etc1 0
# -- infoの例 --
info vars tcl_*;
info exists notexists_val;
set exists_val 10;
info exists exists_val;
# -- exprの例 --
expr 2*3;
expr rand();
expr 10 % 4;
# -- timeの例 --
set cnt 0;
time {incr cnt} 50000;
# -- execの例 --
exec c:/windows/pbrush.exe &;
# -- evalの例 --
set wk1 1;
set wk2 2;
set val {wk1 wk2};
unset $val;
eval unset $val;
# -- traceの例 --
proc proc_etc2 {args} {
  puts $args;
};
trace variable abc wru proc_etc2;
set abc 1;
puts $abc;
unset abc;
# -- regexp,regsubの例 --
regexp (ab).* "cbabcdabebac" a b c d;
puts "$a:$b:$c:$d";
regsub (ab).* "cbabcdabebac" AB e;
puts e;
# -- substの例 --
set wk 123
puts "wk=$wk"
puts {wk=$wk}
puts [subst {wk=$wk}]
# -- catch,updateの例 --
proc proc_etc3 {} {
  catch {destroy .l};
  update;
  label .l -text "TEST";
  pack .l;
  update;
  after 5000;
};
proc proc_etc4 {} {
  catch {destroy .l};
  update;
  label .l -text "TEST";
  pack .l;
  after 5000;
};
proc_etc3;
proc_etc4;
# -- upvar,uplevelの例 --
set wk1 111;
proc proc_etc5 {} {
  set wk1 100;
  proc_etc6 wk1;
  puts "proc_etc5:$wk1";
};
proc proc_etc6 { name } {
  upvar $name val;
  set val 10;
  uplevel #0 {
    puts "proc_etc6:$wk1";
  };
};
proc_etc5;
# -- vwaitの例 --
proc proc_etc7 {} {
  global etc7;
  puts "proc_etc7 in";
  vwait etc7;
}
proc_etc7;
set etc7 1;
afterコマンドは、指定ミリ秒後にスクリプトを実行させる。
その間、制御は戻っている。
clockコマンドは、時間の取得やフォーマットを行う。








各種情報を返す。




演算コマンド。各種演算子・関数あり。



パフォーマンスチェックなどに使用する。


外部プロセスの起動。最後の&はバックグラウンド指示。

インタプリタの真髄とも言えるコマンド。
スクリプトを新規に評価してくれる。


「wk1 wk2」が1ワードのため、全体を変数名とみなしてエラー。
変数置換後の文字列を改めてワード分割するため、unsetには2ワードとして渡される。
変数追跡コマンド。



設定・参照・削除された直後に割り込みが発生してプロシジャが呼ばれる。



正規表現コマンド。
abの繰り返しがあれば、変数 a b c d に入れていく。

正規表現を用いて文字列を置換して変数に格納する。

ブレースで囲まれた文字列内部の置換を行う。
ダブルクォートが使えない・使いにくい場合に便利。
ブレースであれば、入れ子に出来るため。


catchコマンドはエラーを起こさずにスクリプトを処理する。
updateコマンドは保留中のイベント処理をバックグラウンドで処理させる。














ラベルが即表示される。
プロシジャーから制御が返るまで表示されない。
スコープ制御コマンド。
upvarコマンドは、1つ上のスコープの変数をローカルスコープの変数にリンク。
uplevelコマンドは、任意のスコープでスクリプトを実行する。












変数に対する設定が起こるまで、待ち状態になります。
この間は、制御が返りますので、他の処理ができます。
イベントループが無い tclsh で、socket コマンドを使用する場合などに使用します。



proc_etc7を入力直後に制御は返っているので、もう一度エンターを押してください。

 

  after 指定時間(ミリ秒)後に処理を行う。返値は、識別子。
after ms
after ms ?script script script ...?
after cancel id
after cancel script script script ...
after idle ?script script script ...?
after info ?id?
ms 遅延時間をミリ秒で指定する。
?script script script ...? 遅延実行させるスクリプト。指定しない場合、msミリ秒だけウエイトする。
その場合、制御は返らない。
cancel 遅延実行待ちの処理をキャンセルする。
id after コマンドの返値。識別子として使用する。
idle イベント駆動でないアプリケーション(tclshなど)で有効。
vwait でイベントループが発生した場合にスクリプトが実行される。
そのため、wish では即時実行されてしまい、意味が無ない。
info 待機中の処理の情報を返す。id を指定した場合は該当する処理を、
指定しない場合は、すべてを返す。
例) >set id [after 20000 puts OK]
>after info $id
{puts OK} timer
OK
20秒後にスクリプトを実行させる。
実行される前に入力すると、
スクリプトおよびタイマー遅延であることがわかる。
時間が経過すると実行される。
  catch インタプリタにエラー処理をさせずにスクリプトを実行させる。
catch script ?varName?
script 実行するスクリプト。エラーが発生した場合、それ以降のスクリプトは実行されずに、
1が返される。エラーが発生しなければ、0が返される。
?varName? 実行したスクリプトが最後に返す文字列を格納する変数名。
例) >info exists var
0
>set var
can't read "var": no such variable
>catch {set var} ret
1
>set ret
can't read "var": no such variable
変数 var が存在するかをチェック。
存在しない。
存在しない変数を参照すると...
インタプリタがエラートラップする。
しかし、catch すると、
エラートラップはなく、エラー発生した旨の1が返される。
set コマンドの返値の文字列が ret に格納される。
  clock 時間の取得および操作を行う。
clock option ?arg arg ...?
option 何を行うかの指定。
clicks
 システムに依存したもっとも高精度の時間値を整数で返す。
format clockValue ?-format string? ?-gmt boolean?
 時間値を書式に従って成形する。

scan dateString ?-base clockVal? ?-gmt boolean?
 書式に従って文字列を時間値にする。
seconds
 現在の時間値を返す。単位:秒。formatオプションのclockValueに相当する。
?arg arg ...? 操作ごとに必要な値を指定する。
?-format string?:string は、以下の組み合わせが可能です。
 %% Insert a %.
 %a Abbreviated weekday name (Mon, Tue, etc.).
 %A Full weekday name (Monday, Tuesday, etc.).
 %b Abbreviated month name (Jan, Feb, etc.).
 %B Full month name.
 %c Locale specific date and time.
 %d Day of month (01 - 31).
 %H Hour in 24-hour format (00 - 23).
 %I Hour in 12-hour format (00 - 12).
 %j Day of year (001 - 366).
 %m Month number (01 - 12).
 %M Minute (00 - 59).
 %p AM/PM indicator.
 %S Seconds (00 - 59).
 %U Week of year (01 - 52), Sunday is the first day of the week.
 %w Weekday number (Sunday = 0).
 %W Week of year (01 - 52), Monday is the first day of the week.
 %x Locale specific date format.
 %X Locale specific time format.
 %y Year without century (00 - 99).
 %Y Year with century (e.g. 1990)
 %Z Time zone name.
 %D Date as %m/%d/%y.
 %e Day of month (1 - 31), no leading zeros.
 %h Abbreviated month name.
 %n Insert a newline.
 %r Time as %I:%M:%S %p.
 %R Time as %H:%M.
 %t Insert a tab.
 %T Time as %H:%M:%S.
デフォルトは、"%a %b %d %H:%M:%S %Z %Y"です。
?-gmt boolean?:boolean が1であれば、グリニッジ標準時になります。
?-base clockVal?:clockVal からの相対時間にします。
dateString:上記の時間、日付の他、以下の相対時間も使用可能です。
 year, fortnight, month, week, day, hour, minute (or min), second(or sec)
 tomorrow, yesterday, today, now, last, this, next, ago
また、これらは「2year」のような指定も可能でデフォルト係数は、1です。
例) >set now [clock seconds]
923557882
>set str [clock format $now -format "%T %D"]
16:51:22 04/08/99
>clock scan $str
923557882
>clock format [clock scan 2year] -format "%T %D"
16:51:32 04/08/01
現在の時間値を求める。

上記の詳細を見てください。

逆変換すると...
同じ数字が返ってくる。
今から2年後の日付は?
2001年。HAL(^ ^; 
(↑これは最初1999年に作ったらしい。忘)
  eval 引数文字列をTclスクリプトとして解釈し実行する。新たにワード分割から行うため、プロシジャの返値を複数ワードとして、
コマンドに渡す場合などに有効。
eval arg ?arg ...?
arg ?arg ...? Tclスクリプトとして解釈させる文字列。
例) >set wk1 10
10
>set wk2 20
20
>info vars wk*
wk1 wk2
>unset [info vars wk*]
can't unset "wk1 wk2": no such variable
>eval unset [info vars wk*]
変数に値を設定する。



「wk」で始まる変数は?
wk1 と wk2
これらを一度に削除したいが…プロシジャの返値は1ワードなので、変数名が「wk1 wk2」と認識されてしまう。

そこで、eval すると置換後の「unset wk1 wk2」を再評価して無事に、unset されます。
  exec  
   
例) >  
  expr  
   
   
   
例) >  
  info  
   
   
   
例) >  
  time  
   
例) >  
  trace  
   
例)    
  regexp  
   
   
   
例) >  
  regsub  
   
   
   
   
例) >  
  subst  
   
   
   
   
例)    
  update  
   
   
   
   
例)    
  uplevel  
   
例) >  
  upvar  
   
     
  vwait