Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Tcl:如何在Tcl 8.4中搜索嵌套列表?_List_Search_Tcl - Fatal编程技术网

List Tcl:如何在Tcl 8.4中搜索嵌套列表?

List Tcl:如何在Tcl 8.4中搜索嵌套列表?,list,search,tcl,List,Search,Tcl,我有一个嵌套列表,如下所示: set myList { {first apples dollars} {second bananas euros} {third pears pesos} } 在Tcl 8.7中,我可以使用lsearch-index 2(例如),如果我想找到以欧元销售的水果类型: set myFruit [lindex $myList [lsearch -index 2 $myList "euros"] 1] puts $myFruit # retur

我有一个嵌套列表,如下所示:

set myList {
   {first apples dollars}
   {second bananas euros}
   {third pears pesos}
}
在Tcl 8.7中,我可以使用
lsearch-index 2
(例如),如果我想找到以欧元销售的水果类型:

set myFruit [lindex $myList [lsearch -index 2 $myList "euros"] 1]
puts $myFruit    
# returns bananas
但是在Tcl 8.4中,如果不存在
-index
开关,我该怎么做呢?是否有快捷方式,或者我必须使用
foreach

如果可能的话,我希望使用TCl的本机功能,而不是通过任何附加软件包(很遗憾,我无法将其用于我的特定项目)。

根据:

此语法中的keylget命令在找到时返回1,否则返回0。然后将bbb(2)旁边的值放入变量myvar中。请注意,在keylget命令中,somelist前面不应有美元符号($)

因此,对于您的示例,这将是:

set searchTerm "euros"
if {[keylget myList $searchTerm myFruit]} {
    puts $myFruit
}
(没有将此标记为重复,因为589332没有专门处理v8.4;只是有人碰巧在其中一个答案中提到了它。)

根据:

此语法中的keylget命令在找到时返回1,否则返回0。然后将bbb(2)旁边的值放入变量myvar中。请注意,在keylget命令中,somelist前面不应有美元符号($)

因此,对于您的示例,这将是:

set searchTerm "euros"
if {[keylget myList $searchTerm myFruit]} {
    puts $myFruit
}

(没有将此标记为重复,因为589332没有专门处理v8.4;只是有人碰巧在一个答案中提到了它。)

使用
lsearch
的通配符选项可能就是您想要的

set myList {
   {first apples dollars}
   {second bananas euros}
   {third pears pesos}
}

set myFruit [lindex $myList [lsearch $myList "*euros*"] 1]
puts $myFruit
虽然上面也会匹配“神经科学”一词,例如,如果有可能的话,你可以使用下面这样的词:

lsearch -regexp $myList {\yeuros\y}

如果它变得更复杂,比如,如果你想匹配整个子元素(因此不想匹配元素
{forth kiwi“0.5欧元一个”}
中的
euros
),那么与其尝试使搜索更灵活,我相信使用循环会更容易:

for {set i 0} {$i < [llength $myList]} {incr i} {
    if {"euros" in [split [lindex $myList $i]]} {
        set myFruit [lindex $myList $i]
        puts $myFruit
    }
}
对于{set i 0}{$i<[llength$myList]}{incr i}{
如果{[split[lindex$myList$i]]中的{“欧元”}{
设置我的水果[lindex$myList$i]
我的水果
}
}

使用
lsearch
的通配符选项可能就是您想要的

set myList {
   {first apples dollars}
   {second bananas euros}
   {third pears pesos}
}

set myFruit [lindex $myList [lsearch $myList "*euros*"] 1]
puts $myFruit
虽然上面也会匹配“神经科学”一词,例如,如果有可能的话,你可以使用下面这样的词:

lsearch -regexp $myList {\yeuros\y}

如果它变得更复杂,比如,如果你想匹配整个子元素(因此不想匹配元素
{forth kiwi“0.5欧元一个”}
中的
euros
),那么与其尝试使搜索更灵活,我相信使用循环会更容易:

for {set i 0} {$i < [llength $myList]} {incr i} {
    if {"euros" in [split [lindex $myList $i]]} {
        set myFruit [lindex $myList $i]
        puts $myFruit
    }
}
对于{set i 0}{$i<[llength$myList]}{incr i}{
如果{[split[lindex$myList$i]]中的{“欧元”}{
设置我的水果[lindex$myList$i]
我的水果
}
}

这是Jerry答案的延伸:

如果沿着
regexp
路线,并且您可以保证列表的输入列表在经过消毒的Tcl列表字符串表示的意义上是规则的,那么您可以让
regexp
完成所有工作:

 lindex [regexp -all -inline {([^\s]+)\s+euros\}} $myList] 1
这也适用于包含
欧元
作为元素的多个子列表的情况

 foreach {_ v}  [regexp -all -inline {([^\s]+)\s+euros\}} $myList] {puts $v}

这是Jerry答案的延伸:

如果沿着
regexp
路线,并且您可以保证列表的输入列表在经过消毒的Tcl列表字符串表示的意义上是规则的,那么您可以让
regexp
完成所有工作:

 lindex [regexp -all -inline {([^\s]+)\s+euros\}} $myList] 1
这也适用于包含
欧元
作为元素的多个子列表的情况

 foreach {_ v}  [regexp -all -inline {([^\s]+)\s+euros\}} $myList] {puts $v}

如果不使用软件包(除了8.4之外,这是我目前的另一个限制-没有能力/权限加载软件包),我怎么能实现最初的目标?在这种情况下,我想你可能会被
foreach
所困扰。如果不使用软件包,我怎么能实现最初的目标(除了8.4之外,这是我目前的另一个限制——没有能力/权限加载软件包)在这种情况下,我想你可能会被困在
foreach
上。你到底为什么要被困在8.4上?它很旧而且不受支持。无论是谁强迫你进入这种情况都是不好的,应该感到不好。现在是2019年,而不是2004年!被困在tcl 8.4上可能有很多原因,许多客户冻结更改,如果没有任何东西被破坏,他们可能会要求occasi但是Tcl可能不符合升级的条件。你到底为什么要坚持使用8.4?它很旧而且不受支持。无论是谁强迫你这样做都是不好的,应该感到不好。现在是2019年,而不是2004年!坚持使用Tcl 8.4可能有很多原因,很多客户如果没有任何问题,就会冻结更改,他们可能会要求偶尔更改修补程序,但Tcl可能不符合升级条件。