在TCL中将列表作为参数传递

问题描述 投票:1回答:1

我尝试创建一个从用户获取列表的过程,并打印列表的最小值和最大值。我认为问题是将列表作为参数传递给过程。这是我的代码:

proc minmaxlist {mylist} {
    lsort -integer $mylist
    puts "my list is: $mylist\n"
    #puts "the length is $argc\n"
    set min [lindex $mylist 0]
    set max [lindex $mylist [llength[mylist] -1]]
    puts "max is $max"
    puts "min is $min"
}

set mylist [list $argv]

minmaxlist $mylist

我发现,如果我的列表是{5 7 0},我的列表[0]的值为5 7 0而不是5.谢谢!

tcl
1个回答
4
投票

问题不是将列表传递给程序,而是[list $argv]。 argv变量已包含一个列表。通过将其包装在另一个列表命令中,最终得到的列表只包含一个元素(本身就是另一个列表)。然后,该单个元素将最终成为最小值和最大值。所以,只需将$ argv传递给proc,或将mylist设置为$ argv,而不是[list $ argv]。

然后在你的proc中,你对列表进行排序并丢弃结果。您需要将结果存储在变量中。你可以重用mylist:set mylist [lsort -integer $mylist]

您可能还注意到,获取最大值的语句不起作用。你可能打算做set max [lindex $mylist [expr {[llength $mylist] - 1}]]。最后一个元素可以通过set max [lindex $mylist end]更容易获得