Download presentation
Presentation is loading. Please wait.
1
Writing Tcl Scripts (cont.) Outline –Variable Scoping –Strings –Eval –File/Channel I/O –Processes –System Info –Errors –Reflection/Debugging –Libraries Goal –Understand how to write Tcl programs Reading –Ch. 14-18, Practical Programming in Tcl and Tk
2
Variable Scoping (cont.) upvar - call by reference –use to pass variable name rather than value –useful for when passing arrays to procs –upvar associates local variable with variable in higher context –upvar ?level? varName localvar –#0 is global scope –level is 1 (one level up) by default –example proc incrArray { array index amount } { upvar $array A incr A($index) $amount }
3
String Manipulation format - sprintf-style string generation format “Value is %.3f” [expr sqrt(10)] => Value is 3.162 Pattern matching –regexp/regsub - regular subexpression matching/replacement –scan - scanf-style matching –string match - glob-style matching Query string length $str Search string first $str John String-list conversion –split, join
4
Eval eval str - evaluate strings as commands set string “Hello, World!” set cmd [list puts stdout $string] unset string eval $cmd => Hello, World! –eval concatenates several arguments into one list to evaluate uplevel ?level? cmd - do eval in another context subst str - do substitutions, but do not evaluate
5
File/Channel I/O Open/close –open, close - open/close file channel –socket - open TCP socket to port on host Search - cd, glob, pwd I/O - read, write, gets, puts, flush, seek Control –fconfigure - blocking, eof character, etc. Status –file, eof, tell, fblocked –fileevent - execute script when file/channel is readable or writeable Example set f [open [lindex $argv 1] r] if {[gets $f line] >= 0} { puts stdout $line } close $f
6
Processes Execute other programs exec grep foo << $input | wc Specifies a process pipeline –using C shell-like syntax –can put processes in background exec lpr -Plw501 motd.txt & –returns stdout of last subprocess exec date returns: Wed Jan 25 15:23:25 CST 1995 –returns process IDs if in background exec cat motd.txt | wc & returns: 576 577 Note piping done in Tcl, not a string passed to csh
7
System Information Environment –array env contains environment variables env(EDITOR) Process –pid command returns process ID Time –clock command interfaces to system time –get time in clocks or seconds –convert to/from date/time strings –after - execute command after time delay
8
Errors Errors normally abort commands in progress, application displays error message set n 0 foreach i {1 2 3 4 5} { set n [expr {$n + i*i}] } expr command prints: syntax error in expression “$n + i*i”
9
Errors (cont.) Global variable errorInfo provides stack trace set errorInfo => syntax error in expression “$n + i*i” while executing “expr {$n + i*i}” invoked from within “set n [expr {$n + i*i]...” (“foreach” body line 2)...
10
Errors (cont.) Can catch errors with catch command catch {expr {2 +}} msg => 1 set msg => syntax error in expression “2 +” Can generate errors error “bad argument” Global variable errorCode holds machine-readable information about errors (e.g. UNIX errno value)
11
Reflection and Debugging History –like csh history –mostly for interactive use Info –information about internal state –info exists A - does variable A exist? Command names –rename - rename/delete a command Timing –time - time a script for performance analysis Variable tracing –trace variable foo r PrintVar »calls PrintVar whenever foo is read
12
Code Libraries Loading source code into Tcl source init.tcl Autoloading source code –Tcl procedures loaded on demand –using search path of directories –auto_mkindex - generate a file-proc autoload index Packages –load file ?pkgname? ?interp? –load binary package from file and initialize –pkg_mkIndex - generate autoload index –package command - version control
13
Example: Random Numbers proc Random {} { global NextRandom set NextRandom [expr $NextRandom * 1103515245 + 12345] return [expr abs($NextRandom % (0x7fffffff + 1))] } proc MakeRandomList len { for {set i 0} {$i < $len} {incr i} { lappend lst [Random] } return $lst } set NextRandom [expr {[pid]+[clock clicks]}] set rndlst [MakeRandomList 52]
14
Example: tgrep #/user/walker/bin/tclsh if {$argc != 2} { error “Usage: tgrep pattern fileName” } set f [open [lindex $argv 1] r] set pat [lindex $argv 0] while {[gets $f line] >= 0} { if [regexp $pat $line] { puts $line } catch { close $f }
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.