我尝试创建一个从用户获取列表并打印列表的最小值和最大值的过程。 我认为问题在于将列表作为参数传递给过程。 这是我的代码:
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。 谢谢!
答案 0 :(得分:4)
问题不是将列表传递给过程,而是将[list $argv]
传递给过程。 argv变量已经包含一个列表。通过将其包装在另一个list命令中,最终得到一个仅包含一个元素的列表(其本身就是另一个列表)。然后,该单个元素最终将成为最小值和最大值。因此,只需将$ argv传递给proc,或将mylist设置为$ argv,而不是[list $ argv]。
然后在proc中对列表进行排序并丢弃结果。您将需要将结果存储在变量中。您可以为此重复使用我的列表:set mylist [lsort -integer $mylist]
。
您可能还已经注意到,获取最大值的声明不起作用。您可能打算做set max [lindex $mylist [expr {[llength $mylist] - 1}]]
。通过set max [lindex $mylist end]