Tcl/Tkチュートリアル

⚡ スマートサマリー

TCL(Tool Command Language)は、1989年にジョン・オスターハウトによって作成された文字列ベースのスクリプト言語および手続き型言語であり、GUI、ラピッドプロトタイピングなどに広く使用されています。ping、そしてテストでは、すべての値がデフォルトで文字列として扱われます。

  • 🧵 TCLの定義: 文字列をベースとしたスクリプト言語および手続き型言語で、デフォルトではすべてが文字列として扱われます。
  • 実行: tclshシェルを介してTclスクリプトを実行する Windows またはLinuxで、ファイル拡張子は.tclを使用します。
  • 🔄 代替: コマンド(角括弧)、変数($)、およびバックスラッシュによる置換をサポートします。
  • 📦 変数: setで作成、$で読み取り、unsetで削除、info existsで確認。
  • 式: exprコマンドは、算術演算子、関係演算子、論理演算子、ビット演算子、およびその他の演算子を評価します。
  • 🔀 フロー制御: 意思決定やループ処理のために、if/else、switch、while、forといった構文を提供します。

TCL/Tkチュートリアル

TCLとは何ですか?

TCL は、標準入力またはファイルから TCL コマンドを読み取り、必要な結果を与えるシェル アプリケーションです。

TCLは文字列ベースのスクリプト言語であり、手続き型言語でもあります。1989年にジョン・オスターハウトによって初めて作成されました。開発の目的はping この言語はアプリケーションに簡単に組み込むことができます。この言語はGUIやテストによく使用されます。例えば、ラピッドプロトタイピングping, テスト データベースの対話など。TCL ではデフォルトですべてが文字列です。

TCLの実行方法

TCLコードを実行する方法は2つあります。

  1. Windows ベースのアプリケーションはここから入手できます tcltutor exeファイル
  2. Linuxベースのアプリケーション

In Linux 対話型インタープリターでは、以下のように TCL スクリプトを実行できます。

TCL対話型セッションにアクセスするには、次のコマンドを実行します。

TCL チュートリアル: ツール コマンド言語

TCLスクリプト

TCL プログラムには .tcl 拡張子が必要です。 UNIX/LINUX のすべてのスクリプトは TCL シェル パスで始まります

#!/usr/bin/tclsh

例:-

#!/usr/bin/tclsh
Puts "Hello World"
Script execution:-
$ chmod +x helloworld.tcl
$ ./helloworld.tcl

出力: こんにちは世界

TCLでは、「puts」コマンドはコンソールにメッセージを出力するために使用されます。putsの構文は以下のとおりです。

puts ?-nonewline? ?channelId? string

  • 改行なし: このオプションのパラメーターは、デフォルトのコマンドで改行文字を抑制します。 各文字列に改行を入れます
  • チャンネルID: このパラメータは標準入力チャンネル (stdin) と標準出力チャンネル (stdout) に使用されます。

元:-

%puts "Hello World"
% Hello World
%puts stdout  "Hello World"
% Hello World

TCL置換タイプ

TCLにはXNUMX種類の置換があります

  1. コマンド置換
  2. 変数置換
  3. バックスラッシュの置換

一つ一つ勉強していきましょう

コマンド置換

角括弧はコマンドの置換に使用されます。

例:-

% puts [expr 1*3]
% 3

ここでは、角括弧内のコマンドが最初に評価されます。結果が返されます。「expr」は算術計算を実行するために使用されます。

変数置換

TCL は、次の助けを借りて変数置換を実行します。 $ 符号。

例:-

#!/usr/bin/tclsh
set  a  10
puts  a
puts  $a

ここでは、「a」という変数を作成し、値「10」を設定します。

  • put a : 文字列「a」をコンソールに出力しますが、「a」の値は出力しません
  • put $a : 'a' の値をコンソールに出力します

実行して確認してみましょう。 以下のような出力が得られます。

$ ./substitution.tcl

a

10

バックスラッシュの置換

Tclでは、バックスラッシュはエスケープに使用されます。ping 特殊文字だけでなく、長いコマンドを複数行に分割するためにも使用できます。バックスラッシュの直後に続く文字は置換されずにそのまま残ります。以下の例では、バックスラッシュの後に特殊文字「 」が残っていることがわかります。

これを例で検証してみましょう

#!/usr/bin/tclsh

puts "This  is my  \"car\""

$ ./backslashsubstitution.tcl
This is my "car"

ノート: -TCL 内の任意の文字列をコメントするには「#」が使用されます。 「#」以降の文字はすべて、tclsh シェル コマンドによって無視されます。

TCL変数

変数とは、値を保持する識別子です。言い換えれば、変数とは、値が格納されているコンピュータのメモリへの参照です。

変数は「set コマンド」によって作成され、すべての変数名は大文字と小文字が区別されます。 つまり、TCL では Hello、Hello、HELLO はすべて異なります。 大文字と小文字を区別する変数の例を見てください。

% set  name  Techoit
% set  Name  Technoit_1
% set  NAME  Technoit_2

出力:-

% puts $name
% Technoit

%puts  $Name
%Technoit_1

%puts $NAME
%Technoit_2

TCL変数の作成

TCL で変数を作成するには、次を使用する必要があります。 "セットする" command

10を設定します

変数の値を取得するには、次のように「$」記号を使用する必要があります

% $a を入れる

10%

したがって、変数「a」の値は 10 として取得されます。

TCLコマンド情報が存在します

上記のように、「set」コマンドは変数の作成と読み取りに使用されます。「unset」コマンドは変数の破棄に使用されます。「info exists」コマンドは、varNameが現在のコンテキストで変数(または配列要素)として存在する場合は1を返し、存在しない場合は0を返します(以下の例を参照)。

TCLには、「info exists」、「info functions」、「info global」など、さまざまな「info」コマンドがあります。ここでは、「info exists」の例を見てみましょう。

元:-

% set a 20
% puts $a
% 20
% puts [info exists a]
% 1
% unset a
%puts [info exists a]
% 0

さまざまな中括弧とその動作

{} -> 中括弧

TCLでは、波括弧は単語をまとめて引数として扱います。波括弧は、実行が遅延されるブロックを定義するために使用されます。つまり、現在の行のコマンドの残りの部分の後に実行される可能性があります。波括弧内の文字は、記述されたとおりにコマンドに渡されます。

覚えておくべきいくつかのポイント

  1. {} 中括弧内では変数置換は許可されません
  2. リストデータ型の作成に使用されます

例:-

% set x 10
% puts {$x}
% $x

%set number {1 2 3 4 5} -> ここで、number はリスト データ型です。

%puts $number

%1 2 3 4 5

[] -> 角中括弧

角括弧は、ネストされたコマンドを作成するために使用されます。簡単に言うと、あるコマンドの出力が別のコマンドの引数として渡されます。角括弧は、現在の行の残りのコマンドの前に実行されるブロックを定義するために使用され、その結果が行に置き換えられます。

元: -

% set x 10
% puts "y : [set y [set x 10]]"
%y : 10
% puts "x : $x"
%x : 10

() -> 丸括弧

このコマンドは、配列データ型を作成し、演算子の優先順位を示すために使用されます。

% set a(1) 10
% set a(2) 20

ここで、「a」は値 10 と 20 を持つ配列です。キー、キー値のペア、および配列の値を出力するには、以下のコマンドを参照してください。

% puts [array get a] ->  To print key value pairs we use this command
% 1 10 2 20
% puts [array names a]  -> To print only keys
% 1 2
% puts $a(1)   -> To print first value of array
% 10
% puts $a(2)  -> To print second value of array
% 20

配列 a の「N 番目」の値を出力するには、Puts $a(N) を使用します。

TCL コマンドライン引数

コマンドラインからスクリプトに渡されるデータ項目は引数と呼ばれます。 Tcl スクリプトへのコマンド ライン引数の数はグローバル変数として渡されます。 argc。 Tcl スクリプトの名前は、グローバル変数としてスクリプトに渡されます。 argv0、残りのコマンドライン引数はリストとして渡されます。 引数.

TCL には、次の 3 つの事前定義変数があります。

$argc   -> indicates the number of arguments passed to the script

$argv   -> indicates list of arguments

$argv0  -> indicates the name of script

元:-

arg-script.tcl
#!/usr/bin/tclsh
puts   "number of arguments passed to the scripts : $argc"
puts  "list of arguments are passed to the script: $argv"
puts  "the name of scripts is: $argv0"
$ ./arg-script.tcl  10 20 30

出力:-

  • スクリプトに渡される引数の数: 3
  • スクリプトに渡される引数のリスト: 10 20 30
  • スクリプトの名前は : arg-script.tcl

TCL 式と Operaタ

式はオペランドと演算子から構成されます。式は「expr」コマンドで評価されます。 Opera演算子は優先順位と結合性に基づいて評価されます。TCL言語には以下のような組み込み演算子があります。

Operaトーアカテゴリ シンボル 優先順位/結合性
算術 Operaタ + – * / % 左から右へ
リレーショナル Operaタ == != < > <= >= 左から右へ
論理的 Operaタ && || ! 左から右へ
ビット単位 Operaタ & | ^ ~ 左から右へ
ターナリー Operaタ ?: 右から左へ
Shift Operaタ << >> 左から右へ
文字列の比較 Operaタ 等号 ne 左から右へ
累乗 Operaタ ** 左から右へ
リスト Operaタ 左から右へ

算術 Operaタ

TCL式は、オペランド、演算子、括弧の組み合わせで構成されます。TCLの算術演算子の例を見てみましょう。

+ 2つ以上のオペランドを加算する

元:-

%set a 10
%set b 20
%puts [expr $a + $b]
30

– サブtracts 2 つ以上のオペランド

元:-

%set a 20
%set b 10
%puts [expr $a - $b]
10

*2つ以上のオペランドを乗算する

%set a 20
%set b 10
%puts [expr $a * $b]
200

/ 分子を分母で割る

%set a 20
%set b 10
%puts [expr $a / $b]
2

% 剰余演算子は分子を減分子で割りますが、余りを返します

%set a 20
%set b 10
%puts [expr $a % $b]
0

リレーショナル Operaタ

左のオペランドの値が右のオペランドの値より大きいかどうかを確認します。大きい場合は条件が真となり、1 を返し、そうでない場合は 0 を返します。

%set a 20
%set b 10
%puts [expr $a > $b]
1

左オペランドの値が右オペランドの値より小さいかどうかを確認します。小さい場合は条件が真となり、1 を返し、そうでない場合は 0 を返します。

%set a 10
%set b 20
%puts [expr $a < $b]
1

>= 左オペランドの値が右オペランドの値以上かどうかをチェックし、そうであれば条件が真となり 1 を返し、そうでない場合は 0 を返します。

%set a 20
%set b 10
%puts [expr $a >= $b]
1

<= 左オペランドの値が右オペランドの値以下かどうかをチェックし、そうであれば条件が真となり 1 を返し、そうでない場合は 0 を返します。

%set a 20
%set b 10
%puts [expr $a <= $b]
0

!= 1 つのオペランドの値が等しいかどうかをチェックします。値が等しくない場合は条件が真となり 0 を返し、そうでない場合は XNUMX を返します。

%set a 20
%set b 10
%puts [expr $a != $b]
1

== 1 つのオペランドの値が等しいかどうかをチェックします。等しい場合は条件が真となり 0 を返し、そうでない場合は XNUMX を返します。

%set a 20
%set b 10
%puts [expr $a == $b]
0

論理的 Operaタ

&& 両方のオペランドがゼロでない場合、条件は真となり 1 を返し、そうでない場合は 0 を返します。

%set a 20
%set b 10
%puts [expr $a && $b]
1

|| 1つのオペランドのいずれかがゼロでない場合、条件が真となり0を返し、そうでない場合はXNUMXを返します。

%set a 0
%set b 10
%puts [expr $a || $b]
1

! は、任意の式の結果を反転するために使用します。出力を見ると、「a」の値が 0 から 1 に、一方「b」の値が 1 から 0 になっていることがわかります。

%set a 0
%set b 1
%puts [expr !$a]
1
%puts [expr !$b]
0

ビット単位 Operaタ

& (ビット単位の論理積) はビットごとに演算を実行し、演算については以下の表に従います。

A B A&B
0 0 0
0 1 0
1 1 1
1 0 0

元:-

%set A 10
%set B 20

Follow the sequence to convert decimal to binary number
128 64 32 16 8 4 2 1
10 binary equivalents will be
128 64 32 16 8 4 2 1  à  0 0 0 0 1 0 1 0
20 binary equivalents will be
128 64 32 16 8 4 2 1  à  0 0 0 1 0 1 0 0

So now as per above tabular rules

A & B will be 0 0 0 0 0 0 0 0

| (ビット単位のOR) ビットごとに演算を実行し、以下の表に従います。

A B あ | B
0 0 0
0 1 1
1 1 1
1 0 1

元:-

%set A 10
%set B 20

Follow the sequence to convert decimal to binary number
128 64 32 16 8 4 2 1
10 binary equivalents will be
128 64 32 16 8 4 2 1  à  0 0 0 0 1 0 1 0
20 binary equivalents will be
128 64 32 16 8 4 2 1  à  0 0 0 1 0 1 0 0

So now as per above tabular rules

A | B will be 0 0 0 1 1 1 1 0

^ (ビットごとの排他的論理和) ビットごとに演算を実行し、以下の表に従います。

A B A^B
0 0 0
0 1 1
1 1 0
1 0 1

元:-

%set A 10
%set B 20

Follow the sequence to convert decimal to binary number
128 64 32 16 8 4 2 1
10 binary equivalents will be
128 64 32 16 8 4 2 1  à  0 0 0 0 1 0 1 0
20 binary equivalents will be
128 64 32 16 8 4 2 1  à  0 0 0 1 0 1 0 0

So now as per above tabular rules

A ^ B will be 0 0 0 1 1 1 1 0 à 30

~ (ビット否定) 演算子は、1 を 0 に、0 を 1 に変更します。表を参考にしてください。

A ~A
0 1
1 0
%set A 7
%puts [expr ~$A]
-8

ターナリー Operaトール ( ?:)

構文は

condition-expression?  expression_1: expression_2

condition-exp が true の場合、exp1 が評価され、結果が返されます。 cond-exp が false の場合、exp2 が評価され、その結果が返されます。 この例では、A の値が 1 より大きいため、exp6 は true になります。

%set A 7
%set result [expr $A > 6 ? true : false]
%puts $result
true

Shift Operaタ

Shift 演算子は、<< 左シフト演算子、または >> 右シフト演算子のいずれかで示されます。<< 左シフト演算子の場合、左オペランドの値は、右オペランドで指定されたビット数だけ左に移動します。

%set A 7
%set result [expr $A << 2]
%puts $result

>> 右シフト演算子の場合、左オペランドの値は右オペランドで指定されたビット数だけ右に移動します。

%set A 7
%set result [expr $A >> 2]
%puts $result

文字列の比較 Operaタ

文字列比較演算子は、2つのオペランドの値を比較します。オペランドの値が同じ場合は1を返し、そうでない場合は0を返します。この例では、AとBの値は両方とも7なので、結果は1になります。

元:-

%set A 7
%set B 7
%set result [expr $A eq $B]
%puts $result
1

Ne (両方のオペランドの値が異なる場合は 1 を返し、そうでない場合は 0 を返します)

%set A 7
%set B 8
%set result [expr $A ne $B]
%puts $result
1

指数演算子

Pow() と ** はどちらも同じです。 常に浮動小数点値を返します。

** は目的のオペランドの累乗を示します。

元:-

%set A 7
%set result [expr $A ** 2]
%puts $result
49

リスト Operaタ

定義されたリストに要求された値が見つかった場合は1を返し、見つからない場合は0を返します。例えば、変数「a」には値1が存在するため、1が返されます。

set a {1 2 3}
if {1 in $a} {
puts "ok"
} else {
puts "fail"
}
Output: ok

ni、必要な値が定義されたリスト内で見つかった場合は 0 を返し、それ以外の場合は 1 を返します。

元 :-

set a {1 2 3}
if {1 ni $a} {
puts "ok"
} else {
puts "fail"
}
Output: fail

TCL のフロー制御と意思決定

プログラムの流れを変更するために使用されるさまざまなフロー制御および意思決定コマンドがあります。 プログラムの実行は常にソース ファイルの先頭から最後まで始まります。

If ステートメントは、ブール式とそれに続く XNUMX つ以上のステートメントで構成されます。

もし…ならば…文

構文:-

if expr ?then? 体

expr が true と評価された場合、コマンドの本体が実行されます。

元:-

set age 10

if {$age < 20} {
puts "Age is less than 20"
}

Output: Age is less than 20

もし…そうでなければ文

構文 :-

if 式 ? 次に body_1、それ以外の場合 body_2

式が true と評価された場合、body_1 が返され、それ以外の場合は body_2 が返されます。

元:-

set age 10

if {$age < 20} {
puts "Age is less than 20"
} else {
Puts "Age is greater than 20"
}

output: Age is less than 20

ネストされた if..else ステートメント

これは、ある if または else..if ステートメントを別の if または else..if ステートメントの中に入れることができることを意味します。

構文:-

If  {expression_1} {
Body_1
If {expression_2} {
Body_2
}
}

元:-

set a 10
set b 20

if {$a == 10} {
# if expression_1 is true then it will go to expression_2
if {$b == 20} {
#if expression_2 is true then it will print the below string
puts "value of a is 10 and b is 20"
}
}

o/p: value of a is 10 and b is 20

スイッチステートメント

switch ステートメントを使用すると、値のリストに対して変数が等しいかどうかをテストできます。 値のリストを評価し、その評価の結果を返します。 一致する値がない場合は、デフォルト値が返されます。

例::

#!/usr/bin/tclsh

# switch_cmd.tcl

set domain x
switch $domain {

    x { puts "x" }
    y { puts "y" }
    z { puts "z" }
    default { puts "unknown" }
}

ネストされたスイッチ

ネストされた switch ステートメントは、switch ステートメント内の switch ステートメントを意味します。

構文 :-

switch <switchingstring1> {
   <matchstring1> {
      body1
      switch <switchingstring2> {
        <matchstring2> {
           body2
         }
          ...
    switch <switchingstringN> {
          <matchStringN> {
           bodyN
         }
      }
   }

例:次の例では、a の値は 100 ですが、同じコードで switch 文を使って b の値を 200 に変更しています。出力には a と b の両方の値が表示されます。

#!/usr/bin/tclsh

set a 100
set b 200

switch $a {
   100 {
     puts "The value of a is $a"
     switch $b {
        200 {
           puts "The value of b is $b"
        }
     }
   }
}

出力:-

aの値は100です

bの値は200です

TCL ループ ステートメント

ループ文を使用すると、文または文のグループを複数回実行できます。Tcl では、次のタイプのループが提供されています。ping 声明。

コマンド中

指定された条件が true の場合、ループ本体内のステートメントまたはステートメントのグループが繰り返されます。

構文:

While  {condition} {
    Statements
}

元 :-

#!/usr/bin/tclsh

Set a 10

While {$a < 12} {
    Puts "a is $a"
    incr a
}

出力:-

aは10です

aは11です

上記の例では、組み込みコマンド「incr」が使用されています。これは、「a」の値が最大値(12未満)になるまで1ずつ増加することを意味します。

コマンド用

これは、カウンター値に基づいて一連のステートメントを複数回実行します。カウンター値は、ループの各繰り返し時に自動的に増減します。

構文 :-

For {start} {test} {next} {
Body
}

例:以下の例では、「i」の値は0に設定され、値が5未満になるまで増加します。

#!/usr/bin/tclsh

for {set i 0} {$i < 5} {incr i} {
put $i
}

出力:-

0
1
2
3
4

よくあるご質問

はい。Tclは、自動化、テスト、EDAツール、ネットワークデバイスのスクリプト作成、アプリケーションへの組み込みなどに今でも使用されています。Expectツールや多くのテストフレームワークはTclに依存していますが、新しいWebアプリケーションではあまり一般的ではありません。

Tclはスクリプト言語であり、TkはGUIを構築するためのグラフィカルツールキットです。Tcl/Tkを組み合わせることで、シンプルなコマンドを使ってクロスプラットフォームのデスクトップアプリケーションを作成できます。

exprコマンドは、Tclにおける数式および論理式を評価します。Tclはすべてを文字列として扱うため、算術演算、比較演算、およびブール演算を実行するにはexprが必要です。

AIアシスタントはTclコードを生成し、set、puts、exprなどのコマンドを説明し、擬似コードをTclに変換し、構文エラーをデバッグできます。ping 初心者は言語をより早く習得できる。

はい。AIツールはTclスクリプトを次のような言語に変換できます。 Python または Perl、マップping コマンドと制御構造は開発者が確認すべきだが、出力の正確性も確認する必要がある。