我尝试创建一个从用户获取列表的过程,并打印列表的最小值和最大值。我认为问题是将列表作为参数传递给过程。这是我的代码:
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.谢谢!
问题不是将列表传递给程序,而是[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]
更容易获得