1.コマンドラインTclの文は、UNIXやMS-DOSのコマンドラインと同じ書式です。 Tclスクリプトも先頭がコマンドで、そのあとにコマンドが必要とするアーギュメントが続きます。 2.ブランクとタブコードの機能(アーギュメント区切り)ブランク及びタブコードは、コマンドとアーギュメント、及びアーギュメント間の区切りコードです。 3.改行コードとセミコロン文字の機能(コマンドライン区切り)改行コード及びセミコロン文字は、コマンドラインの区切りコードです。 4.ダブルコーテーション引用符の機能(文字列)ブランク、タブ、改行コードを含んだアーギュメントをコマンドに渡すには””で挟みます。 5.$文字の機能(変数置換)アーギュメントに記述された$文字は変数置換子です。$が先頭に付いた文字列は変数とみなされ、値に置換されてからコマンドに渡されます。 6.ブランケット引用符 [ ]の機能(コマンド置換)アーギュメントに記述された[ ]引用符はコマンド置換子です。 上記のコマンドラインがTclパーサーに渡されると、[ ]ではさまれたコマンドラインの計算結果20030がsetコマンドに渡されます。これをコマンド置換と呼びます。 7.\文字の機能(バックスラッシュシーケンス)\文字はC/C++と同等のバックスラッシュシーケンス機能を持ちます。 8.ブレース引用符{ }の機能(置換抑制)アーギュメントの前後に記述された{ }引用符は、中に含まれるあらゆる特殊文字の機能(置換機能)を無効化し、すべて単なる文字としてコマンドにそのまま渡します。¥文字もそのまま渡されます。 9.式プログラミング言語では、代入式や数値演算式などの式が言語仕様の中に組み込まれています。Tclにも式はありますが、これはTclが言語として提供しているものではなく、exprやifコマンドが提供しているものです。つまり式をアーギュメントとして受け付けるコマンドにのみC言語相当の数値演算式、論理演算式、関係演算式を記述することができます。 10.定数Tclが扱う定数は文字列定数のみですが、コマンドごとに様々な記述様式がサポートされています。 11.変数の型Tclパーサーが扱う変数の型は文字列だけです(サイズ自動拡張)。 12.変数の名前変数名には漢字も含めて全ての文字が使えます。 13.変数のスコープと寿命変数の型はコマンドに預けていますが、変数のスコープや変数の寿命はTclパーサーが管理しています。 14.配列変数配列変数は変数名に( )が付いている変数です。 15.リスト変数とリスト処理Tclの特長にリスト処理があります。
|
| lappend llength lsort |
lindex lrange join |
linsert lreplace split |
※斜体は省略可能なアーギュメント。...は複数指定可能を示す。
リストを結合して新しいリストを返す。
変数varNameに要素$val...を追加し結果のリストを返す。
リスト$listから$index番目の要素を取り出して返す。$indexは0から。
リスト$listの$index番目の要素の前に全ての要素$val...を挿入したリストを返す。
すべての要素$val...を要素としたリストを返す(生成)。
リスト$listの要素数を返す
リスト$listの$first番目から$last番目までの連続要素をリストとして返す。
$lastに文字列endを与えると最後の要素までの指定となる。
先頭が0である。
リスト$listの$first番目から$lastまでの連続要素をすべての要素$valで
置きかえ、新しいリストを返す。
リスト$listから、$switchであたえられたパターンマッチング方式で、
$patternに合致する最初の要素の順番を返す。
マッチング方式は-glob -exact -regexpの3種で、-globがデフォルト。
-exactは完全一致。
-regexpは正規表現規則。
-globはglob方式。
※glob,正規表現の解説はパターンマッチングを参照してください。
リスト$listの要素をソートしたリストを返す。
$switchは-integer(整数) -ascii(文字) -real(実数)の3種。
-asciiがデフォルト。
$directionは方向スイッチで、-decreasingを指定すると降順となる。
リスト$listの要素を$joinStringで結合した文字列を返す。
$joinStringのデフォルトはスペース。
文字列$stringを、$splitCharsで区切られた文字列を要素としたリストを返す。
$splitCharsのデフォルトはブランク。
このコマンドは、joinコマンドと逆の関係にある。
実行例 Tclsh.exeで実際に実行してみてください。右が実行結果です。
set List [list bb aa cc {} dd ee] → bb aa cc {} dd ee
llength $List → 6
lrange $List 2 end → cc {} dd ee
lsearch $List cc → 2
lindex $List 4 → dd
lappend List ff gg → bb aa cc {} dd ee ff gg
linsert $List 2 xx yy → bb aa xx yy cc {} dd ee ff gg
lsort $list → {} aa bb cc dd ee ff gg
lreplace $List 1 xx yy → bb xx yy cc {} dd ee ff
join $List - → bb-aa-cc--dd-ee-ee-gg
split "aa\tbb\tcc\t\tdd" \t → aa bb cc {} dd
| if foreach eval |
for break |
while continue |
switch source |
※斜体は省略可能なアーギュメント。...は複数指定可能を示す。
test1:body1(Tclスクリプト)を実行する条件式。真ならbody1が実行される
test2:test1の条件が偽のとき評価される条件式。
真ならbody2(Tclスクリプト)が実行される
bodyn:すべての条件が偽のとき実行されるTclスクリプト
init:初期設定Tclスクリプト
test :ループ条件式(真ならループ継続)
reinit:再設定Tclスクリプト
body:Tclスクリプト(処理本体)
test:条件式(真ならループ継続)
body:Tclスクリプト(処理本体)
stringを検査し、合致したpatternのbody(Tclスクリプト)を実行する。
switchはパターンマッチング方式の指定であり
-glob -exact -regexpの3種がある。
デフォルトは -glob
リストlistから要素を取り出して変数valNameListに順に代入後、bodyを実行。
この処理をlistの先頭要素から最後の要素まで繰り返す。
ループ脱出。for while switch foreachのbodyに記述可
ループの条件式評価にジャンプ。for while foreachのbodyに記述可
Tclスクリプトファイル$sourceFileNameをオープンし内容を実行後、結果を返す。
すべてのアーギュメントをスペースを挟んで結合したあと、
その文字列をTclスクリプトとして実行し結果を返す。
コマンドをダイナミックに作成して実行する場合に使用する。
|
scan string compare string index string range string trim |
regexp string first string length string tolower string trimleft |
※斜体は省略可能なアーギュメント。...は複数指定可能を示す。
$formatStringはANSII Cに準拠した変換指定子。
変換指定子の順に、その数だけ値$valを与える。変換結果が返される。
$formatStringの指定に基づいて$stringを解析し変換指定子ごとに
値をvarNameに代入する。
正しく変換された数が返される。
正規表現$expが$stringに合致するか否か調べ、合致すれば1を、
しなければ0を返す。
変数名varNameが与えられていれば合致した文字をセットする。
$switchesに-nocaseを指定すると大文字小文字の区別が無視される。
-indicesを指定すると変数にセットされるのは合致した部分文字列の
インデックスリスト(例"5 8")になる。
regexpと同様の検査をするがglob形式でパターンマッチングを行う。
さらに、合致する部分を$changeに置き換え、その結果の文字列を変数varNameに
セットする。
$switchesに-nocaseを与えると大文字小文字の違いを無視する。
また-allを与えると$stringの中の合致文字置換はすべてに対して行われる。
指定しないと合致した最初の文字列だけの置換となる。
$string1と$string2を辞書順で調べ、1が2より小さい、等しい、大きいの順で
-1,0,1を返す
$string2の中で最初に$string1に合致した部分文字のインデックスを返す。
合致しなければ-1を返す。
$string2の中で最後に$string1に合致した部分文字列の先頭インデックスを返す。
$stringの中から$index番目の文字を返す。
範囲外なら空文字を返す。
$stringの文字数を返す。
glob形式のマッチング規則で、$pattenが$stringに合致していれば1を
不合致なら0を返す。
$stringの$firstから$last番目までの文字列を返す。
$stringを小文字変換して返す。
$stringを大文字変換して返す。
$stringの両脇にある$removeCharsを取り除いた文字列を返す。
string trimと同じだが先頭文字だけが切り捨てられる。
string trimと同じだが末尾文字だけが切り捨てられる。
実行例 Tclsh.exeで実際に実行してみて下さい。右が実行結果です。
set txt AABBCCDDEEFFGGHHAA
string length $txt → 18
string index $txt 2 → B
string range $txt 0 5 → AABBCC
string range $txt 6 end → DDEEFFGGHHAA
string trim $txt A → BBCCDDEEFFGGHH
string trimleft $txt A → BBCCDDEEFFGGHHAA
string trimright $txt A → AABBCCDDEEFFGGHH
string tolower $txt → aabbccddeeffgghhaa
string compare $txt AABB → 1
string first CCD $txt → 4
string last AA $txt → 16
regexp B* $txt → 1
regsub -all AA $txt ZZZ newtxt → ZZZBBCCDDEEFFGGHHZZZ
format “%6.6s” $txt → AABBCC
regexp,regsub,string match,switchコマンドなどが文字列を比較するとき、その比較方法(パターンマッチング)にglob形式や正規表現が用いられます。
glob形式とは、OSにファイル名を指定するときに用いられる馴染みの深い方法です(DIR *.dat など)。
glob形式では次の特殊文字が使えます。
* 任意の長さ(ゼロを含む)の文字列 |
123ABC*
の文字列に対するマッチング結果
*ABC 真
ABC* 偽
??????? 真
?????? 偽
???A?C? 真
????A?C 偽
??????\* 真
[0-9]* 真
[A-Z]* 偽
*[A-Z]* 真
*[D-Z]* 偽
?2??B?? 真
glob形式の弱点は「文字列が数字のみから構成されているか」というような指定ができないことです。
[0-9]はひとつの文字に対する評価であり、もし3桁の数字か否かを評価するには[0-9][0-9][0-9]と指定しなければならず、とても冗長です。しかも桁数の指定も伴ってしまいます。
これに対し、正規表現は強力です。
[0-9]+
と指定するだけで、桁数を問わず数字のみで構成されている文字列か否かを判定できます。
+は「直前の文字の1つ以上の繰り返し」という意味を持ちます。
正規表現では下記の特殊文字が使えます。
. 任意の1文字 |
正規表現は文字ひとつひとつについて指定していきます。それらを要素と呼びます。
要素は文字か[ ]で与えられる文字範囲です。
それらの要素を( )で挟んでグループ化すると、ひとつの要素として扱われます。
要素の繰り返しを * +で指定できます。
?はその要素がない場合も可とするものです。
*+?を演算子と考え、( )でグループ化できることを考えると、正規表現は多項式の構造をもっており、文字列の構造式と呼べるものであることがわかります。
16進数として正しく記述されている文字列か否かを判定する正規表現を考えてみます。
まず「先頭に0xが付いていてもいなくても可とする」は
^(0x)? と表現されます。
( )で挟んで要素0とxをグループ化し0xの文字列を生成しています。
^は文字列の先頭(0xの前に文字はない)を表しています。
?は直前の要素―即ち0xがあってもなくても良いことを表しています。
つぎに「16進数に使える文字」を指定します。
それは[0-9a-fA-F]と表現されます。
そしてこれらの文字が繰り返して現れるのであるから+を付けて
[0-9a-fA-F]+ となります。
これらの文字だけが連続したあと「文字列は終了する」ことを表す$を末尾につけて、最終的に下記の正規表現となります。
^(0x)?[0-9a-fA-F]+$
これをregexpコマンドに与えて文字列を評価すると下記の例となります。
regexp {^(0x)?[0-9a-fA-F]+$} 0x25AF →1
regexp {^(0x)?[0-9a-fA-F]+$} 25af →1 (正規表現の?が+なら0です)
regexp {^(0x)?[0-9a-fA-F]+$} 25aG →0 (正規表現に$がなければ1です)
regexp {^(0x)?[0-9a-fA-F]+$} 0x →0 (正規表現の+が?なら1です)
正規表現をアーギュメントにして渡す時は必ず{ }
ではさんで下さい。
正規表現の特殊文字がTclの特殊記号と重複しているからです。
正規表現は、その解釈のアルゴリズムを考えるともっと理解が深まります。
正規表現によるパターンマッチングは次のように処理されます。
まず正規表現の最初の要素を取り出します。
その要素で文字列の先頭文字を評価します。
合致していなければ次の文字を調べ、これを合致するまで繰り返します。
合致する文字が現れたら次の要素を取り出します。
その要素が+記号だったら前回の要素で、次の文字を評価します。
これも合致していれば次の文字を評価し、合致しない文字が現れるまでこれを繰り返します。
+記号はそのような処理を要求するものです。
合致しない文字が現れたら、次の要素を取り出してその文字を評価します。
このような手順で評価をすすめ、全要素について評価がすめば最終判断として合致(TRUE)を返します。
気を付けるべきことは、全要素の評価が終わらないうちに合致判断はされないが、文字列の全文字を調べなくても全要素の評価がすめば合致判断されるということです。
例えば文字列が12345のとき、正規表現234でのマッチングは4の文字が評価された段階で合致判定されます。
ただし^と$記号で要素が挟まれていれば全文字列の評価が行われます(正規表現が
^234$ なら評価はFALSEです)。
正規表現はglob形式より複雑ですが、複雑な文字列評価が1行でプログラミングできますのでTclの強力な文字処理機能の代表格と言えるものです。
| cd gets eof pwd |
open read file |
close seek flush |
puts tell glob |
※斜体は省略可能なアーギュメント。...は複数指定可能を示す。
作業ディレクトリィを変更する。
ファイルを開きファイル識別子を返す。
$accessはr,r+,w,w+,a,a+のいずれか。
デフォルトはr。
ファイルを閉じる。
文字列$stringを識別子$fileIdのファイルに書く。
$fileIdを省略するとstdoutに出力される。
$optionに-nonewlineを指定しないと改行コードが書かれる。
識別子$fileIdのファイルから文字列を読み込み、変数varNameに代入し
その文字数を返す。
ファイル末尾に達した場合は-1を返す。
変数名が省略されると文字列を返す。
末尾に達した場合は空文字を返す。
識別子$fileIdのファイルから残りのデータをすべて読み込み、それらを返す。
-nonewlineが指定されている場合には末尾に改行コードがあれば削除される。
識別子$fieldIdファイルのアドレス$offsetにシークする。
$originはstart,current,endのいずれか。
省略するとstart。
識別子$fileIdファイルの現在のアクセス位置を返す。
識別子$fileIdファイルのアクセス位置がeofに達している場合は1を、
それ以外の場合は0を返す。
ファイル名$fileNameのファイルに$optionで与えた操作を行う。
$optionは下記のいずれか。
atime |
最後に参照された時刻を返す |
dirname |
ファイル名からディレクトリ名を取り出す |
executable |
実行可能なら1を返す |
exists |
存在し、アクセス可能なら1を返す |
extension |
ファイルの拡張子を取り出す |
isdirectory |
ディレクトリファイルなら1を返す |
isfile |
通常のファイルなら1を返す |
lstat |
lstatのシステムコールを実行しargで与えた変数に結果を返す |
mtime |
最後に修正された時刻を返す |
owned |
現在のオーナーが自分なら1を返す |
readable |
読み込み可能なら1を返す |
readlink |
リンクファイル名を返す |
rootname |
最後のドットまで(ドットは含まない)の文字列を返す |
size |
ファイルサイズを返す |
stat |
システムコールstatを実行し、argで与えた変数に結果を返す |
tail |
ファイル名を返す |
type |
ファイルの種類を返す。種類はfile,directory,など |
writable |
ファイルが書き込み可能なら1を返す |
バッファに蓄積されているデータを識別子$fileIdのファイルに吐き出す。
$patternに合致するすべてのファイル名のリストを返す。
現在の作業ディレクトリ名を返す。
infoコマンドはTclインタープリタが保持している内部情報を取り出します。
info+ |
args commands exists library patchlevel tclversion |
body complete hostname locals procs vars |
cmdcount default level nameofexecutable script |
$procname(プロシージャ名)のアーギュメントリストを返す(bodyを参照)。
$procname(プロシージャ名)の中身を返す。
tclsh.exe
% proc test {a b } {
% return [expr $a * $b]
% }
% info args test
% a b
% info body test
% return [expr $a * $b]
プロシージャが現在までに実行したコマンド数を返す。
info cmdcount自身も数に含まれる。
※ブラケットで囲まれたコマンドの実行(コマンド置換)は数にふくまれません。
$pattern(プロシージャ名の検索文字-glob型式・省略可)に、合致する
プロシージャのリストを返す。
内部コマンドも含まれる。
$patternを省略すると全てのコマンド・プロシージャのリストを返す。
$command(コマンドライン)に与えられたコマンドラインが正しく完結しているか
調べる。
完結していれば1を返す。
ダブルクオートやブラケットなどが閉じていない場合は0を返す。
tclsh.exe
% info complete {set a "this is a pen}
% 0
% info complete {set a "this is a pen"}
% 1
$procname(プロシージャ名)の$arg(そのプロシージャの中のひとつの
アーギュメント名)のデフォルト値を調べる。
デフォルト値を持たない場合は0を返す。
デフォルト値をもつならばその値をvarnameにセットして1を返す。
tclsh.exe
% proc test {{a 3} b} {
% return [expr $a * $b]
% }
% info default test b var
% 0
% info default test a var
% 1
% puts $var
% 3
変数varnameが存在するか調べる。
PCのホスト名を返す。
$number (コマンド階層・省略可)を省略すると現在の階層番号を返す。
$number を与えると、その階層のプロシージャ名を返す。
$number は自分の階層より小さい値(上層)を指定する(1以上)。
例えば、testプロシージャからコールされるtest2プロシージャ内で
info levelを実行すると2がリターンされる。
そして、続けてinfo level 2を実行するとtest2が返され
info level 1を実行するとtestが返される。
ライブラリが格納されているディレクトリを返す。
これはグローバル変数 tcl_libraryの値。
sourceコマンドにおける、tclソースファイルのデフォルト格納先である。
ローカル変数リストを返す。
$pattern(変数名の検索文字列・glob型式・省略可)を省略すると
全てのローカル変数名リストを返す。
$patternを与えると合致するローカル変数リストのみを返す。
ローカル変数とはglobalおよびupvarで宣言されていない、プロシージャ内部の
変数で、ローカル変数にはプロシージャのアーギュメントも含まれる。
実行ファイル名を返す。
tclsh.exe
% info nameofexecutable
% A:\WinGeo\tclsh.exe
グローバル変数tcl_patchLevelの値を返す。
$pattern(変数名の検索文字列・glob型式・省略可)を省略すると、
現在の名前空間内の全てのプロシージャ名リストを返す。
$patternに名前空間名を検索文字として与えると、その名前空間内に
定義されたプロシージャ名リストを返す。
tclソースファイル名を返す。
sourceコマンドで評価されるソースファイル内に記述されたとき有効。
tclのバージョンを返す。
現在アクセスできるグローバル及びローカル変数リストを返す。
$pattern(変数名の検索文字列・glob型式・省略可)を省略すると
全ての変数名リストを返す。
$patternを与えると合致する変数リストのみを返す。
変数にはプロシージャのアーギュメントも含まれる。
(C)FreeSoftNet,Inc. |