Purpose: discuss general guidelines for gathering input and then making use of it in Tcl.
A new user often finds s/he has a problem when dealing with user input.
Sometimes, the problem is a file name with a space in it. Sometimes, the problem is a string with special characters like [ or $ .
On this page, please add notes to help a new programmer avoid these problems.
One important thing is to keep the type of the input string in mind as you code. While Tcl has the reputation of everything is a string, not every command expects all its arguments to be arbitrary strings. In the most obvious example, Tcl input or output commands which require a file handle expects that argument to be a string returned from an open type command. Just handing some arbitrary string is very likely not going to work.
Similarly, handing an arbitrary string to a command which expects an argument in a list format may very well not work either:
set s "this is a test of [ ; and ]" puts [llength $s]
does not result in a number, but instead with the error:
invalid command name "and" while executing "and " invoked from within "set s "this is a test of [ ; and ]"" (file "/tmp/s1.tcl" line 3)
If in the above example, s was the result of a gets or read Tcl command, the developer could find the same error arising from arbitrary user input.
The reason is that llength's interface is documented as requiring a list as its argument - the input above isn't a properly quoted list.
DGP - uhhh... no. Look at the stack trace above. We never reach the llength command because the error occurs during command substitution of the arguments to set. This is a simple error in Tcl syntax having nothing to do with list/string issues.