A-A+

TCL脚本构造命令eval

2020年05月24日 脚本 阅读 4,039 views 次

在TCL中eval命令用于创建和运行TCL脚本的通用构造块。它接受任意多个参数,把它们用分隔符串接起来,然后把串接的结果作为一个TCL脚本处理。所有的TCL解析规则都正常应用于这个脚本,因此这个脚本可以包含多个命令,展开为多行,包含注释等。

eval的一个用途是生成命令,把它们存放在变量中,然后再把这个变量作为TCL脚本运行。例如下面这段脚本:

set reset {

set a 0

set b 0

set c 0

}

eval reset

将变量a、b、c的值清零,然后调用eval命令。如果编写一个应用程序,其中的脚本是作为一个动态过程的结果产生的,使用eval执行脚本会非常方便。

eval还可以强制TCL进行下一级命令的解析。在解析一条命令时,TCL解析器只进行一级解析和替换;一次替换的结果不会再被解析替换。然而,有时候另一级的解析是必需的,eval就提供了完成这个任务的机制。通常,这种情况出现在您有存放在一个变量中或作为一个命令的返回值的一个值的列表,而您需要把这个列表作为分开的值传给一个命令的时候。例如,假设变量vars包含了一个变量列表,您希望删除列表中的变量。一个解决方案是使用如下脚本:

set vars {a b c d}

foreach i $vars {

unset $i

}

这个脚本能完成任务,但是unset命令可以接受任意多个参数,因此应该可以用一条命令就删除所有的变量。遗憾的是,下面这个脚本不能工作:

set vars {a b c d}

unset $vars

这个脚本的问题在于传给unset命令的变量列表是一个参数,而不是分开的各个变量名。因此unset会试图删除一个名为a b c d的变量。对于TCL8.5更好的解决方案是使用{*}语法进行参数展开:

set vars {a b c d}

unset {*}$vars

对于T8.5以前的版本,唯一的解决方案就是使用eval:

set vars {a b c d}

eval unset $vars

eval将它的参数串接起来,形成新的命令unset a b c d,将它传给TCL进行处理。命令字符串会得到解析,各个变量名作为独立的参数传给unset。

只要这个示例中的变量名是在一个规则的TCL列表中,只有空格或制表符作为元素分隔符,这种方法甚至在有些变量名包含空格或$这样的特殊字符时也能正常工作。命令:

eval unset $vars

等同于命令:

eval [concat unset $vars]

在上面两种情况下,由eval处理的脚本都是规则的列表,其第一个元素是unset,其他元素是vars的元素。

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: