0

这是脚本:

#!/usr/bin/expect

set a1 "aaa"
set a2 "bbb"
set a3 "ccc"

for {set b 1} {$b<4} {incr b} {
   send a$b
}

输出是:

 a1a2a3

看起来而不是值

$a1
$a2
$a3

我们得到的只是“变量”的实际名称,即

a1
a2
a3

让我们试试这段代码:

send $$b

现在输出是

$1$2$3

这意味着如果我们能把信a偷偷溜进去……我们可以创造

$a1
$a2
$a3

我怎样才能把字母“a”偷偷溜进去?

之后我需要做类似的事情..

$c = $$b
send $c

这意味着这些值变为 $c 然后我可以执行 $c with send

 $c = $$b

不管用。也没有。

 set c = $$b

或者

c=$$b

最终目标是打印

$a1 and $a2 and $a3

一些推荐的数组和列表,但它们似乎不是有序的或没有组织的,所以我可以轻松地编辑 $a1、$a2、$a3 等(手动)

4

3 回答 3

2

通常,当您执行此类操作时,实际上最好使用数组。

set a(1) "aaa"
set a(2) "bbb"
set a(3) "ccc"

for {set b 1} {$b<4} {incr b} {
     send $a($b)
}

这是因为数组元素名称的解析规则是针对一般字符串的规则,而不是针对非常受限的变量名子集的解析规则$

于 2013-08-24T12:00:44.890 回答
1

列表或数组没有错...

但你要求这个:

eval "puts \$a$b"

但是,仍然list是完全针对该任务的,请使用它。

编辑:似乎正确的方法是:

puts [set a$b]
于 2013-08-24T03:34:23.217 回答
0

只完成了一轮变量替换,但命令替换可以嵌套,因此您需要使用命令。只有一个参数,set只返回具有该名称的变量的值(在早期的 Tcl 版本中没有$variable替换,您必须使用[set variable])。

set a 100
set b "a"
set c "b"
puts [set [set [set c]]]
puts [set [set $c]] ;# same result

但不要使用set索引技巧。Tcl 已经有可以用任何字符串索引的数组和字典(Tcl 8.5 和更高版本),并用整数列出该索引,这样更快。

set a [list "aaa" "bbb" "ccc"]
for {set b 0} {$b <= 2} {incr b} {
  send [lindex $a $b]
}
于 2013-08-24T12:43:37.567 回答