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

在TCL中将列表作为参数传递,tcl,Tcl,我尝试创建一个过程,从用户那里获取列表并打印列表的最小值和最大值。 我认为问题在于将列表作为参数传递给过程。 这是我的密码: 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 [llengt

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

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
我发现如果我的列表是{570},我的列表[0]的值是570而不是5。
谢谢

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

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


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

更容易获得。问题不是将列表传递给过程,而是[list$argv]。argv变量已包含一个列表。通过将其包装到另一个list命令中,您将得到一个只包含一个元素的列表,而该元素本身就是另一个列表。然后,单个元素将同时成为最小值和最大值。因此,只需将$argv传递给proc,或者将mylist设置为$argv,而不是[list$argv]

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

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

argv已经是一个列表,因此您要将该列表放入一个新列表中:mylist将只有一个元素。请尝试minmaxlist$argvargv已经是一个列表,因此您要将该列表放入一个新列表中:mylist将只有一个元素。请尝试minmaxlist$argv