Hướng dẫn Tcl/Tk
⚡ Tóm tắt thông minh
TCL (Tool Command Language) là một ngôn ngữ kịch bản và lập trình thủ tục dựa trên chuỗi ký tự được John Osterhout tạo ra vào năm 1989, được sử dụng rộng rãi cho giao diện người dùng đồ họa (GUI), tạo mẫu nhanh...pingvà quá trình kiểm thử, trong đó mọi giá trị đều được coi là chuỗi ký tự theo mặc định.

TCL là gì?
TCL là ứng dụng shell đọc lệnh TCL từ đầu vào tiêu chuẩn của nó hoặc từ một tệp và đưa ra kết quả mong muốn.
TCL là ngôn ngữ kịch bản dựa trên chuỗi và cũng là ngôn ngữ lập trình thủ tục. Nó được John Osterhout tạo ra lần đầu tiên vào năm 1989. Mục đích của việc phát triển...ping Ngôn ngữ này dễ dàng tích hợp vào các ứng dụng. Nó thường được sử dụng cho giao diện người dùng đồ họa (GUI) và kiểm thử. Ví dụ, tạo mẫu nhanhping, Kiểm tra tương tác cơ sở dữ liệu, v.v. Trong TCL theo mặc định, mọi thứ đều là một chuỗi.
Cách thực hiện TCL
Có hai cách để thực thi mã TCL:
- Windows ứng dụng dựa trên có sẵn ở đây tập tin exe tcltutor
- Ứng dụng dựa trên Linux
In Linux trình thông dịch tương tác, chúng ta có thể thực thi các tập lệnh TCL như bên dưới
Để truy cập phiên tương tác TCL, hãy thực hiện lệnh sau
Tập lệnh TCL
Chương trình TCL phải có phần mở rộng .tcl. Mọi tập lệnh trong UNIX/LINUX đều bắt đầu bằng đường dẫn shell TCL
#!/usr/bin/tclsh
Thí dụ:-
#!/usr/bin/tclsh Puts "Hello World" Script execution:- $ chmod +x helloworld.tcl $ ./helloworld.tcl
Đầu ra: Chào thế giới
Trong TCL, lệnh “Puts” được sử dụng để in thông báo ra màn hình console. Cú pháp của lệnh puts như sau:
puts ?-nonewline? ?channelId? string
- Không có dòng mới: Tham số tùy chọn này chặn ký tự dòng mới theo lệnh mặc định. Nó đặt một dòng mới cho mỗi chuỗi
- Kênh ID: Thông số này dùng cho kênh đầu vào tiêu chuẩn (stdin) và kênh đầu ra tiêu chuẩn (stdout).
Bán tại:-
%puts "Hello World" % Hello World %puts stdout "Hello World" % Hello World
Loại thay thế TCL
Có ba loại thay thế trong TCL
- Thay thế lệnh
- Thay thế biến
- Thay thế dấu gạch chéo ngược
Chúng ta hãy nghiên cứu từng cái một
Thay thế lệnh
Dấu ngoặc vuông được sử dụng để thay thế lệnh.
Thí dụ:-
% puts [expr 1*3] % 3
Ở đây, lệnh nằm giữa dấu ngoặc vuông được thực thi trước. Kết quả được trả về. "expr" được sử dụng để thực hiện phép tính số học.
Thay thế biến
TCL thực hiện thay thế biến với sự trợ giúp của $ ký tên.
Thí dụ:-
#!/usr/bin/tclsh set a 10 puts a puts $a
Ở đây chúng ta tạo một biến có tên là “a” và đặt giá trị “10” cho nó.
- đặt a : Nó sẽ in chuỗi “a” nhưng không in giá trị của 'a' ra bàn điều khiển
- đặt $a : Nó sẽ in giá trị của 'a' ra bàn điều khiển
Hãy thực hiện và xác minh nó. Bạn sẽ nhận được kết quả như dưới đây.
$ ./substitution.tcl
a
10
Thay thế dấu gạch chéo ngược
Trong Tcl, dấu gạch chéo ngược được sử dụng cho lệnh esca.ping Các ký tự đặc biệt cũng như để trải dài các lệnh dài trên nhiều dòng. Bất kỳ ký tự nào ngay sau dấu gạch chéo ngược sẽ được giữ nguyên mà không bị thay thế. Trong ví dụ bên dưới, bạn có thể thấy ký tự đặc biệt ” “, vẫn được giữ nguyên sau dấu gạch chéo ngược.
Hãy xác minh điều này bằng một ví dụ
#!/usr/bin/tclsh puts "This is my \"car\"" $ ./backslashsubstitution.tcl This is my "car"
GHI CHÚ: -Để bình luận bất kỳ chuỗi nào trong TCL “#” được sử dụng. Tất cả các ký tự sau dấu “#” đều bị lệnh shell tclsh bỏ qua.
Biến TCL
Biến là một định danh chứa một giá trị. Nói cách khác, biến là một tham chiếu đến vùng nhớ của máy tính, nơi giá trị được lưu trữ.
Các biến được tạo bằng “lệnh đặt” và tất cả các tên biến đều phân biệt chữ hoa chữ thường. Nó có nghĩa là xin chào, xin chào, xin chào tất cả đều khác nhau ở TCL. Hãy xem một số ví dụ về biến phân biệt chữ hoa chữ thường.
% set name Techoit % set Name Technoit_1 % set NAME Technoit_2
Đầu ra: -
% puts $name % Technoit %puts $Name %Technoit_1 %puts $NAME %Technoit_2
Tạo biến TCL
Để tạo biến trong TCL, bạn cần sử dụng "bố trí" lệnh
Đặt số 10
Để lấy giá trị của biến phải sử dụng ký hiệu “$” như
% đặt $a
% 10
Vì vậy, chúng ta nhận được giá trị của biến 'a' là 10.
Thông tin lệnh TCL tồn tại
Lệnh “set” được sử dụng để tạo và đọc các biến như đã trình bày ở trên. Lệnh “unset” được sử dụng để hủy một biến. Lệnh “info exists” trả về 1 nếu varName tồn tại dưới dạng biến (hoặc phần tử mảng) trong ngữ cảnh hiện tại, ngược lại trả về 0 (xem ví dụ bên dưới).
Trong TCL có nhiều lệnh “info” khác nhau như “info exists”, “info functions”, “info global”, v.v. Sau đây chúng ta sẽ xem một ví dụ về lệnh “info exists”.
Bán tại:-
% set a 20 % puts $a % 20 % puts [info exists a] % 1 % unset a %puts [info exists a] % 0
Niềng răng khác nhau và hành vi của chúng
{} -> Dấu ngoặc nhọn
Dấu ngo ngoặc nhọn trong TCL nhóm các từ lại với nhau để tạo thành các đối số. Dấu ngo ngoặc nhọn được sử dụng để định nghĩa một khối lệnh bị trì hoãn – nói cách khác, nó có thể được thực thi SAU phần còn lại của lệnh trên dòng hiện tại. Các ký tự bên trong dấu ngo ngoặc được truyền cho lệnh chính xác như được viết.
Một số điểm cần nhớ
- Không được phép thay thế biến trong dấu ngoặc nhọn {}
- Nó được sử dụng để tạo kiểu dữ liệu danh sách
Thí dụ:-
% set x 10 % puts {$x} % $x
%set number {1 2 3 4 5} -> Số ở đây là kiểu dữ liệu danh sách
% đặt số $
% 1 2 3 4 5
[] -> dấu ngoặc vuông
Dấu ngoặc vuông được sử dụng để tạo các lệnh lồng nhau. Nói một cách đơn giản, đó là kết quả của một lệnh được truyền làm đối số cho một lệnh khác. Dấu ngoặc vuông được sử dụng để định nghĩa một khối lệnh được chạy TRƯỚC phần còn lại của lệnh trên dòng hiện tại, và kết quả được thay thế vào dòng đó.
Bán tại: -
% set x 10 % puts "y : [set y [set x 10]]" %y : 10 % puts "x : $x" %x : 10
() -> niềng răng tròn
Lệnh này được sử dụng để tạo kiểu dữ liệu mảng và cũng cho biết mức độ ưu tiên của toán tử.
% set a(1) 10 % set a(2) 20
Ở đây “a” là một mảng có giá trị 10 và 20. Xem các lệnh bên dưới để in các khóa, cặp giá trị khóa và giá trị của mảng.
% 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
Để in giá trị “Nth” của mảng a, chúng ta sẽ sử dụng Puts $a(N)
Đối số dòng lệnh TCL
Các mục dữ liệu được truyền đến tập lệnh từ dòng lệnh được gọi là đối số. Số lượng đối số dòng lệnh cho tập lệnh Tcl được truyền dưới dạng biến toàn cục argc. Tên của tập lệnh Tcl được truyền cho tập lệnh dưới dạng biến toàn cục argv0và phần còn lại của các đối số dòng lệnh được chuyển dưới dạng danh sách trong argv.
TCL có 3 biến được xác định trước như
$argc -> indicates the number of arguments passed to the script $argv -> indicates list of arguments $argv0 -> indicates the name of script
Bán tại:-
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
đầu ra:-
- Số lượng đối số được truyền cho tập lệnh: 3
- Danh sách các đối số được truyền vào tập lệnh: 10 20 30
- Tên của tập lệnh là: arg-script.tcl
Biểu thức TCL và Operator
Biểu thức được xây dựng từ các toán hạng và toán tử. Nó được đánh giá bằng lệnh “expr”. Operators được đánh giá dựa trên mức độ ưu tiên và tính kết hợp. Ngôn ngữ TCL có các toán tử tích hợp như sau
| OperaDanh mục Tor | Mã | Ưu tiên/Kết hợp |
|---|---|---|
| toán học Operator | + – * / % | Từ trái sang phải |
| Quan hệ Operator | == != < > <= >= | Từ trái sang phải |
| logic Operator | && || ! | Từ trái sang phải |
| Bitwise Operator | & | ^ ~ | Từ trái sang phải |
| Đệ tam Operator | ?: | Phải sang trái |
| Shift Operator | << >> | Từ trái sang phải |
| So sánh chuỗi Operator | eq ne | Từ trái sang phải |
| Phép tính Operator | ** | Từ trái sang phải |
| Danh sách Operator | trong ni | Từ trái sang phải |
toán học Operator
Biểu thức TCL bao gồm sự kết hợp của toán hạng, toán tử và dấu ngoặc đơn. Hãy xem ví dụ về toán tử số học trong TCL
+ Thêm hai hoặc nhiều toán hạng
Bán tại:-
%set a 10 %set b 20 %puts [expr $a + $b] 30
– Phụ lụctracts hai hoặc nhiều toán hạng
Bán tại:-
%set a 20 %set b 10 %puts [expr $a - $b] 10
* Nhân hai hoặc nhiều toán hạng
%set a 20 %set b 10 %puts [expr $a * $b] 200
/ Chia tử số cho tử số
%set a 20 %set b 10 %puts [expr $a / $b] 2
Toán tử % mô đun chia tử số cho số khử nhưng trả về lời nhắc
%set a 20 %set b 10 %puts [expr $a % $b] 0
Quan hệ Operator
Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không. Nếu có thì điều kiện trở thành đúng và trả về 1, ngược lại trả về 0.
%set a 20 %set b 10 %puts [expr $a > $b] 1
Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không. Nếu có thì điều kiện trở thành đúng và trả về 1, ngược lại trả về 0
%set a 10 %set b 20 %puts [expr $a < $b] 1
>= Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành đúng và trả về 1 nếu không trả về 0
%set a 20 %set b 10 %puts [expr $a >= $b] 1
<= Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành đúng và trả về 1, ngược lại trả về 0
%set a 20 %set b 10 %puts [expr $a <= $b] 0
!= Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu giá trị không bằng thì điều kiện trở thành true và trả về 1, ngược lại trả về 0
%set a 20 %set b 10 %puts [expr $a != $b] 1
== Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu có thì điều kiện trở thành đúng và trả về 1 nếu không trả về 0
%set a 20 %set b 10 %puts [expr $a == $b] 0
logic Operator
&& Nếu cả hai toán hạng đều khác 1 thì điều kiện trở thành đúng và trả về 0, ngược lại trả về XNUMX
%set a 20 %set b 10 %puts [expr $a && $b] 1
|| Nếu bất kỳ toán hạng nào trong hai toán hạng khác 1 thì điều kiện trở thành đúng và trả về 0, ngược lại trả về XNUMX
%set a 0 %set b 10 %puts [expr $a || $b] 1
! Được sử dụng để đảo ngược kết quả của bất kỳ biểu thức nào. Ở đây trong kết quả, bạn có thể thấy giá trị của 'a' đã trở thành 1 từ 0. Trong khi đó, giá trị của 'b' đã trở thành 0 từ 1.
%set a 0 %set b 1 %puts [expr !$a] 1 %puts [expr !$b] 0
Bitwise Operator
& (bitwise and) thực hiện thao tác từng bit và tuân theo bảng bên dưới để thực hiện thao tác.
| A | B | A & B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
| 1 | 0 | 0 |
Bán tại:-
%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
| (bitwise or) thực hiện thao tác từng bit và làm theo bảng bên dưới
| A | B | Một | b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
| 1 | 0 | 1 |
Bán tại:-
%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
^ (loại trừ bit hoặc) thực hiện thao tác từng bit và làm theo bảng bên dưới
| A | B | A ^ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
| 1 | 0 | 1 |
Bán tại:-
%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
~ (phủ định bit) toán tử thay đổi mỗi 1 thành 0 và 0 thành 1, theo bảng tham chiếu
| A | ~A |
|---|---|
| 0 | 1 |
| 1 | 0 |
%set A 7 %puts [expr ~$A] -8
Đệ tam Operator ( ? :)
Cú pháp là
condition-expression? expression_1: expression_2
Nếu điều kiện-exp đúng, exp1 được đánh giá và kết quả được trả về. Nếu cond-exp sai, exp2 sẽ được đánh giá và kết quả của nó sẽ được trả về. Trong ví dụ của chúng tôi, exp1 đúng khi giá trị của A lớn hơn 6.
%set A 7 %set result [expr $A > 6 ? true : false] %puts $result true
Shift Operator
Shift toán tử được biểu thị bằng toán tử dịch chuyển trái << hoặc toán tử dịch chuyển phải >>. Đối với toán tử dịch chuyển trái <<, giá trị toán hạng trái được dịch chuyển sang trái theo số bit được chỉ định bởi toán hạng phải.
%set A 7 %set result [expr $A << 2] %puts $result
Đối với toán tử dịch chuyển >>, giá trị toán hạng bên trái được di chuyển sang phải theo số bit được chỉ định bởi toán hạng bên phải.
%set A 7 %set result [expr $A >> 2] %puts $result
So sánh chuỗi Operator
Toán tử so sánh chuỗi so sánh giá trị của hai toán hạng. Nếu giá trị của hai toán hạng giống nhau, nó sẽ trả về 1, ngược lại trả về 0. Trong ví dụ này, giá trị của cả A và B đều là 7, do đó kết quả trả về là 1.
Bán tại:-
%set A 7 %set B 7 %set result [expr $A eq $B] %puts $result 1
Ne (nếu giá trị của cả hai toán hạng khác nhau thì nó sẽ trả về 1, nếu không thì trả về 0)
%set A 7 %set B 8 %set result [expr $A ne $B] %puts $result 1
Toán tử lũy thừa
Pow() và ** đều giống nhau. Nó luôn trả về giá trị nổi.
** cho biết sức mạnh của toán hạng mong muốn.
Bán tại:-
%set A 7 %set result [expr $A ** 2] %puts $result 49
Danh sách Operator
Nếu giá trị cần tìm được trong danh sách đã định nghĩa, nó sẽ trả về 1, ngược lại trả về 0. Trong ví dụ này, giá trị 1 tồn tại trong biến 'a', do đó nó sẽ trả về 1.
set a {1 2 3} if {1 in $a} { puts "ok" } else { puts "fail" } Output: ok
ni, nếu giá trị bắt buộc được tìm thấy trong danh sách đã xác định thì nó sẽ trả về 0, nếu không thì trả về 1.
Bán tại :-
set a {1 2 3} if {1 ni $a} { puts "ok" } else { puts "fail" } Output: fail
Kiểm soát luồng TCL và ra quyết định
Có nhiều lệnh điều khiển luồng và ra quyết định khác nhau được sử dụng để thay đổi luồng của chương trình. Việc thực thi chương trình luôn bắt đầu từ đầu tệp nguồn đến cuối tệp.
Câu lệnh if bao gồm biểu thức Boolean theo sau là một hoặc nhiều câu lệnh.
Câu lệnh If …
Cú pháp: -
nếu expr thì? thân hình
nếu expr được đánh giá là true thì phần thân lệnh sẽ được thực thi.
Bán tại:-
set age 10 if {$age < 20} { puts "Age is less than 20" } Output: Age is less than 20
Câu lệnh if … else
Cú pháp: -
Nếu biểu hiện? sau đó là body_1 còn lại là body_2
Nếu biểu thức được đánh giá là đúng thì nó sẽ trả về body_1 nếu không nó sẽ trả về body_2
Bán tại:-
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
Câu lệnh if..else lồng nhau
Nó có nghĩa là một câu lệnh if hoặc else..if có thể được đặt bên trong một câu lệnh if hoặc else..if khác.
Cú pháp: -
If {expression_1} { Body_1 If {expression_2} { Body_2 } }
Bán tại:-
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
Chuyển đổi câu lệnh
Câu lệnh switch cho phép kiểm tra sự bằng nhau của một biến so với danh sách các giá trị. Nó đánh giá danh sách các giá trị và trả về kết quả của đánh giá đó. Nếu không có giá trị nào khớp thì giá trị mặc định sẽ được trả về.
Ví dụ:
#!/usr/bin/tclsh # switch_cmd.tcl set domain x switch $domain { x { puts "x" } y { puts "y" } z { puts "z" } default { puts "unknown" } }
Công tắc lồng nhau
Câu lệnh switch lồng nhau có nghĩa là câu lệnh switch bên trong câu lệnh switch.
cú pháp :-
switch <switchingstring1> { <matchstring1> { body1 switch <switchingstring2> { <matchstring2> { body2 } ... switch <switchingstringN> { <matchStringN> { bodyN } } }
Ví dụTrong ví dụ sau, giá trị của a là 100, và với cùng một đoạn mã, chúng ta sử dụng câu lệnh switch cho giá trị khác của b là 200. Kết quả đầu ra sẽ hiển thị giá trị của cả a và 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" } } } }
Đầu ra: -
Giá trị của a là 100
Giá trị của b là 200
Câu lệnh vòng lặp TCL
Câu lệnh vòng lặp cho phép thực thi một câu lệnh hoặc một nhóm câu lệnh nhiều lần. Tcl cung cấp các loại vòng lặp sau:ping tuyên bố.
Lệnh trong khi
Khi một điều kiện nhất định là đúng thì một câu lệnh hoặc một nhóm câu lệnh sẽ lặp lại trong thân vòng lặp.
cú pháp:
While {condition} {
Statements
}
Bán tại :-
#!/usr/bin/tclsh Set a 10 While {$a < 12} { Puts "a is $a" incr a }
Đầu ra: -
a là 10
a là 11
Trong ví dụ trên, lệnh tích hợp “incr” được sử dụng. Điều này có nghĩa là giá trị của 'a' sẽ được tăng lên 1 cho đến giá trị tối đa (<12).
Đối với lệnh
Nó thực thi một chuỗi các câu lệnh nhiều lần dựa trên giá trị của một bộ đếm. Giá trị này tự động tăng hoặc giảm trong mỗi lần lặp của vòng lặp.
cú pháp :-
For {start} {test} {next} {
Body
}
Ví dụTrong ví dụ bên dưới, giá trị của 'i' được đặt bằng 0 và tăng dần cho đến khi giá trị nhỏ hơn 5.
#!/usr/bin/tclsh for {set i 0} {$i < 5} {incr i} { put $i }
Đầu ra: -
0 1 2 3 4

