Training, Open Source computer languages
PerlPHPPythonMySQLApache / TomcatTclRubyJavaC and C++LinuxCSS 
Search for:
Home Accessibility Courses Diary The Mouth Forum Resources Site Map About Us Contact
For 2021 - online Python 3 training - see ((here)).

Our plans were to retire in summer 2020 and see the world, but Coronavirus has lead us into a lot of lockdown programming in Python 3 and PHP 7.
We can now offer tailored online training - small groups, real tutors - works really well for groups of 4 to 14 delegates. Anywhere in the world; course language English.

Please ask about private 'maintenance' training for Python 2, Tcl, Perl, PHP, Lua, etc.
Array names - variable substitution

Posted by neilvp (neilvp), 8 October 2006
Is it possible to have variable substitution when calling an array?

For example I am generating a gui that is to display the function and state of a number of registers within a device.

My approach to this is to do :-

array set register27 {
                                0  Off On "Link State"
                                1  Disabled Enabled "Output State"
                                 and so on

array set register32 {
                                0  10 100 "Link Speed"
                                1  None Errored "Error State"
                                 and so on
So that by looking at say bit 0 of register 27 I will get back either a 0 or a 1 which I can then display as

The function is [lindex $register27(0) 2] and its state is [lindex $register(0) $bitvalue)
(where bit value is either 0 or 1 of course)

That works but what I would like to do is loop through all the registers and all their contents and what I can't get to work is :

set regnos 27

The function of register $regnos bit $bit is [llindex $register$regnos($bit)  2]

The error message is 'can't read 'register' no such variable.

i.e it is the $register$regnos($bit)  that goes wrong

So, how do I use variable substitution in array referencing please... or should I use a different approach?

Many thanks


Posted by admin (Graham Ellis), 9 October 2006
You're looking to "double parse" the input - in other words, to look for variable names within variabale names.   That's not something Tcl normally does - for efficiency's sake, once a variable name has been parsed it's not reparsed just to check there are no more dollars in it.  BUT you can force a double parse using set.   Here's and example with a simple variable bit it should work just as well with and array:

set regno 27
set register27 Mydemo
puts [set register$regno]

Would I do it that way?  No.  I would probably have an array called register and elements with names that contain extra parameters:

array set register {    
      27,0  Off On "Link State"
       27,1  Disabled Enabled "Output State"
        and so on
       32,0  10 100 "Link Speed"
       32,11  None Errored "Error State"
        and so on

but there may be something I don't know about your application that rukes this out.

This page is a thread posted to the opentalk forum at and archived here for reference. To jump to the archive index please follow this link.

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2022: Well House Manor • 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • FAX: 01144 1225 793803 • EMAIL: • WEB: • SKYPE: wellho