Table of Contents
Hello! Welcome to my guide on the Tool Command Language (TCL). I‘m excited to teach you about this extremely useful, easy to learn scripting language.
In this TCL tutorial for beginners, you‘ll learn:
- What exactly TCL is
- Why it‘s a great scripting language to know
- How to execute TCL code
- Syntax, variables, control flow and more
- String handling and regular expressions
- And how to build your own scripts
By the end, you‘ll have a solid grasp of TCL fundamentals allowing you to leverage this versatile language in your projects.
Sound good? Let‘s dive in!
What is TCL and Why Learn It?
TCL (pronounced "tickle") stands for Tool Command Language. It is a popular, open-source, cross-platform scripting language known for its simplicity and ability to be easily embedded into applications.
First released in 1988 by professor John Ousterhout, TCL has grown over 30+ years to become one of most widely used scripting languages.
According to RedMonk language rankings, TCL usage is still increasing as it ranks in their top 20.
So what makes TCL a great scripting language? Here are some key capabilities:
- Extensible & Embeddable – Extend apps through TCL scripting interfaces
- Easy to Learn Syntax – Readable code using braces and brackets
- Cross-Platform – Write once, run anywhere including Linux, Mac, Windows
- Feature-rich – String handling, regexes, OO capabilities and more
- Interpreted – No compilation needed for rapid testing
- Procedural – Straightforward, sequential programming
With 20+ commands built-in, TCL lets you get up and running fast without the bloat of heavier languages.
Let‘s compare TCL to other common scripting languages:
| Language | Pros | Cons |
|---|---|---|
| TCL | Embeddable, simple syntax, cross-platform | Not as fast, lacks libraries |
| Python | Huge ecosystem of libraries, OO code | Significant whitespace, GIL |
| Perl | Feature-rich, great for text processing | Complex syntax, messy code |
| Ruby | Clean OO syntax, versatile | Performance issues, multiple versions |
| PHP | Built for web, easy deployment | Messy language design |
As we can see, TCL strikes a nice balance between ease of use and advanced functionality compared to peers.
According to colleagues I‘ve spoken with who use TCL daily, they highlight these benefits:
- Ability to add scripting and customization to apps
- Rapid testing and prototyping
- Great for manipulating text data
- Fun and easy to build small command line tools
So while TCL may not be suitable for every use case compared to Python or Java, it excels at embedding scripting into systems and has a unique set of strengths.
Now that you know what TCL is and why it‘s beneficial, let‘s look at how we execute TCL code…
Executing TCL Code
A great way to learn a programming language is by getting feedback instantly with an interactive shell. We also will want to run .tcl script files.
Let me show you how to do both with TCL.
Launching the TCL Shell
Most Linux, macOS and Unix-based operating systems come pre-installed with the tclsh command to launch a TCL shell.
To fire one up, just type tclsh from your terminal:
$ tclsh
%
We‘re now inside the interactive shell as indicated by the % prompt. This allows us to test small code snippets.
Let‘s start with the obligatory hello world:
% puts "Hello World!"
Hello World!
The puts command simply prints out a string.
Next, try assigning values to variables:
% set myVar "Greetings!"
Greetings!
% puts $myVar
Greetings!
We don‘t need to declare variables upfront. By prefixing with $ we can access the variable value.
The TCL shell lets us test snippets before adding them to scripts.
Executing TCL Script Files
While the interactive shell is great, we‘ll also want to execute reusable TCL program files.
First, create a file named hello.tcl with the .tcl extension and add:
#!/usr/bin/tclsh
puts "Hello from my TCL script!"
The shebang line tells the system how to execute this.
To run our script:
$ tclsh hello.tcl
Hello from my TCL script!
We could also mark the script itself as executable:
$ chmod +x hello.tcl
$ ./hello.tcl
Hello from my TCL script!
This allows building reusable TCL tools that can be version controlled and shared.
Now that you‘ve seen how to run TCL code both interactively and via standalone scripts, let‘s dive further into the syntax itself…
TCL Syntax Basics
When scanning any TCL program file or code snippet, we first notice:
- Statements – Commands that do something
- Expressions – Code that represents values
- Substitutions – Special characters modifying execution
Getting familiar with each will help understand how TCL scripts flow and execute.
Statements & Expressions
The structure of a TCL program consists of statements that represent commands:
set myVar 10
puts "My variable is: $myVar"
The set and puts lines here are statements executing distinct actions.
Expressions are used inside statements to dynamically represent values:
set myVar 10
puts [expr {$myVar + 5}]
$myVar + 5 gets evaluated and printed out by the puts command.
So think of statements as actions, while expressions generate data.
One way expressions empower TCL is by avoiding duplicate statements each time we want to print variables, do math, etc – we simply reference already defined expressions.
This is similar to concepts like variables in other languages.
Now that you know the building blocks of commands vs data in TCL, let‘s explore variables themselves…
Using Variables
Variables in TCL serve as simple labels pointing to pieces of data we want to refer to later.
They are created using the set command:
set myNum 42
set myName "John"
No type or size declarations needed – they are made on the fly.
To get the value associated with a variable, prefix it with $:
set myNum 42
puts "My number is $myNum"
This prints out the contents of myNum.
Variables don‘t have to just be simple strings or numbers either. Some things to note:
- Variables are global in scope by default
- They can contain lists of values
- Or represent assoc arrays with string keys
Let‘s see some examples:
Lists:
set primes {2 3 5 7 11 13}
puts $primes
# 2 3 5 7 11 13
Assoc Arrays:
set pokemon(Pikachu) electric
set pokemon(Charmander) fire
puts $pokemon(Pikachu)
# electric
We reference array elements by key.
These features combined with easy intermixing of strings and numbers make TCL variables flexible enough for most tasks.
Up next: controlling script execution flow…
Controlling Code Flow
What good is scripting without being able to adapt to different conditions and loop over data?
Thankfully, TCL incorporates robust control structures for altering the path of code execution.
Some examples include:
If Statements
The if command allows conditional logic to determine if a block runs:
set x 5
if {$x < 10} {
puts "x is less than 10"
}
We can chain an else clause for the false condition:
if {$x >= 10} {
puts "x is greater than 10"
} else {
puts "x is less than 10"
}
TCL uses these boolean expression patterns often.
Switch Statements
When we want to check a value against multiple conditions, switch statements come in handy:
switch $x {
4 {
puts "x is 4"
}
5 {
puts "x is 5"
}
default {
puts "x is something else"
}
}
Useful for replacing long chains of if/else.
While Loops
Performing iteration in TCL is easy with while loops.
Keep executing a block of code as long as a condition remains true:
set x 10
while {$x > 0} {
puts "x = $x"
incr x -1
}
Here we decrement x by 1 each pass.
For Loops
When we need to iterate a specific number of times, for loops help:
for {set i 0} {$i < 5} {incr i} {
puts "The count is $i"
}
We initialize a counter, check a condition each pass, increment it, and execute the body.
Pattern matching loops like these allow TCL to repeat actions easily.
There are more advanced control structures like handling errors, but these core concepts empower most scripting tasks.
Now that you can adapt code flow with variables, conditions and loops, let‘s look at how we can organize TCL programs…
Procedures & Functions
So far in our TCL journey we‘ve focused on straightforward scripts. But most real programs require some modularization.
Procedures and functions help with reusing logic.
A procedure represents a reusable action:
proc sayHello {} {
puts "Hello World!"
}
sayHello
Define once with proc, call wherever needed.
Functions are like procedures, but can return data:
proc multiply {x y} {
expr {$x * $y}
}
set product [multiply 2 5]
puts $product
Return via expr, assign the result to variables.
Procedures and functions promote:
- Code reuse
- Encapsulation
- Abstraction
- Easier testing
They allow growing projects while keeping complexity manageable.
Up next – manipulating strings!
Built-in String Handling
One area where TCL dominates most other scripting languages is the breadth of built-in string manipulation commands.
We‘re already familiar with puts for printing strings and gets for input.
But TCL incorporates 30+ string handling functions!
For example:
Get the length of a string:
set myStr "Hello World"
puts [string length $myStr]
Convert case:
set upper [string toupper $myStr]
puts $upper
Find a substring:
set idx [string first "World" $myStr]
puts $idx
Substitute characters:
set replaced [string replace $myStr 1 2 "there!"]
puts $replaced
And tons more!
This robust text processing makes TCL well suited for tasks like data parsing/analysis, working with user input, testing regexes and building command line string utilities.
Speaking of regular expressions…
TCL Regular Expressions
On top of excellent string manipulation, TCL also incorporates regular expressions – an advanced way of matching text patterns commonly used in programming.
For example, check if an input string matches an email pattern:
set email "[email protected]"
if {[regexp {^[^@]+@[^@]+\.[^@]+} $email]} {
puts "Valid format"
} else {
puts "Invalid format"
}
Our regex helps validate proper formatting for emails.
We can also extract sub-patterns with capturing groups:
set data "Name: John, Age: 35"
regexp {Name: (.+), Age: (\d+)} $data fullName age
puts $fullName
puts $age
This pulls the name and age into separate variables we can work with.
And check if a string contains 4 digit numbers:
regexp {\d{4}} $str
Handy for validating inputs.
These regular expression abilities combined with Tcl‘s string handling power unlock tons of text processing abilities.
Now let‘s walk through a full script example…
Sample TCL Script: Grep Clone
We‘ve covered many key aspects of TCL at this point – let me demonstrate how they come together with a simple grep-like search tool clone:
#!/usr/bin/tclsh
if {$argc < 2} {
puts "Usage: tclgrep pattern file"
exit
}
set pattern [lindex $argv 0]
set path [lindex $argv 1]
if {![file exists $path]} {
puts "File not found"
exit
}
set fileId [open $path]
set index 0
while {[gets $fileId line] >= 0} {
set idx [string first $pattern $line]
if {$idx >= 0} {
puts "$index:$line"
}
incr index
}
close $fileId
What‘s happening?
- Check for CLI arguments
- Get regex pattern and file path
- Validate file exists first
- Loop through lines of the file
- Search for pattern match
- Print context if found
- Increment counter
This shows how we can combine concepts like:
- Variables
- Control flow
- File I/O
- String manipulation
- Regular expressions
To build a simple yet useful command line tool with Tcl!
There are many more great examples out there, but hopefully this script provides some inspiration on what is possible.
Now let‘s wrap up with where to go next…
Where To Go From Here
Congratulations! I really enjoyed guiding you through this comprehensive introduction to the Tool Command Language.
We covered a ton of ground around:
- What TCL is and why it‘s useful
- Executing TCL code
- The syntax basics
- Variables
- Control flow
- Procedures and functions
- Powerful string manipulation
- Pattern matching with regular expressions
- And even an example script
You now have a solid grasp of the most essential TCL programming concepts.
I‘m confident you can now write simple scripts, build command line tools and extend applications with TCL.
Here are some suggestions on what to learn next:
- Practice writing more TCL programs and utilities
- Dive deeper into specific areas like OO programming
- Look at common libraries like Tcllib
- Try embedding TCL into a tool like AutoIt for testing
- Explore using TCL for web scraping with tools like mechanize
- Look into using TCL for GUI automation on desktop apps
I hope you enjoyed this guide, and please reach out if you have any other TCL tutorial topics you would like me to cover!
Happy coding!