With a bit of searching I found that syntactic elements like parentheses, comment delimiters, characters that can be used for syntactic symbols and others are managed by a syntax table (look it up in the elisp reference manual) . With the help of describe-syntax
I compared the syntax tables for perl-mode and tcl-mode. In perl-mode the character $
is given the class character quote but in tcl-mode it is class symbol.
So the solution is, to give $
another class than symbol but I think, character quote is not the right one, because the manual states about this class:
Characters used to quote the following character so that it loses
its normal syntactic meaning. This differs from an escape
character in that only the character immediately following is ever
affected.
AFAIK the class expression prefix is far better suited:
Characters used for syntactic operators that are considered as part
of an expression if they appear next to one. In Lisp modes, these
characters include the apostrophe, ‘'’ (used for quoting), the
comma, ‘,’ (used in macros), and ‘#’ (used in the read syntax for
certain data types).
tl;dr
The following form changes the tcl syntax table after it is defined:
(with-eval-after-load "tcl"
(modify-syntax-entry ?$ "'" tcl-mode-syntax-table))
with-eval-after-load
was introduced in 24.4 for older version, there is the function eval-after-load
(see: What is “with-eval-after-load” in Emacs Lisp)