1

我一直在研究这个,因为我正试图在我的商店中使用路由器时开始使用 TCL。我们有一位技术人员正在编写我可以访问的脚本,因此我正在尝试从他的工作中学习。

我在一个脚本的开头遇到了以下部分,我一直在努力理解并且进展甚微。我希望你能帮助任何解释。

该部分设置提示,并创建稍后在脚本中使用的提示设置。

set prompt "(%|#|\\$) $"      ;# default prompt
catch {set prompt $env(EXPECT_PROMPT)}
set spec "(,|%|\\)|\\(|;|:|\\.|\\*|\[|\]| |/|{|}|\\||\\$|\"|\'|\\\\|-)"

稍后,变量spec的值使用如下:

set cmd "show clock"
regsub -all $spec $cmd "_" cmde

所以我真的很想知道发生了什么,但我的“网络 foo”在这方面完全让我失望。

谢谢!马克

4

1 回答 1

2

regsub 命令将一组“特殊”字符转换为下划线。正spec则表达式可能更容易理解(也更容易阅读),如下所示:

set spec {[][,%)(;:.* /{}|$"'\\-]}

括号、逗号、百分号、圆括号、分号、冒号、点、星号、空格、斜杠、大括号、管道、美元、双引号、单引号、反斜杠、连字符 -- (如果你想在字符类中放置括号,您必须将右括号作为第一个字符)

稍微推断一下,如果目标是将所有非字母数字字符更改为下划线,请这样做

regsub -all {\W} $cmd "_" cmde

\W是“非单词字符”的正则表达式简写

http://tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm

另一种设置提示变量的方法,以及我将如何编写它:

if {[info exists env(EXPECT_PROMPT)]} {
    set prompt $env(EXPECT_PROMPT)
} else {
    set prompt {[%#$] $}
}

如果您正在学习 Tcl,请使用Tcl 教程

于 2012-12-14T17:27:45.803 回答