2017-07-26 56 views
1

因此,可以说我有下面这两个列表:部分模式对于那些在两个列表中TCL元素匹配

ListA包含:

{{feed_sesmmu1_qmusharemem_se_smmu0_int} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_datvld} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[31]} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[30]} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[29]} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[28]} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[27]} 
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[26]}} 

ListB

{{se_smmu0_int} 
{se_smmu0_soc_rd_datvld} 
{se_smmu0_soc_rd_dat[29]} 
{se_smmu0_soc_rd_dat[31]} 
{se_smmu0_soc_rd_dat[30]} 
{se_smmu0_soc_rd_dat[28]} 
{se_smmu0_soc_rd_dat[26]} 
{se_smmu0_soc_rd_dat[27]}} 

现在我需要{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[27]}匹配{se_smmu0_soc_rd_dat[27]}listA的其他元素应该匹配中的对应元素。

回答

0

您可以

lmap s $ListB { 
    lsearch -inline $listA *[string map {[ \\[ ] \\]} $s] 
} 

做到这一点的想法是采取列表ListB每个项目,然后在列表listA搜索该项目。需要注意的是:ListB中的一些项目中包含括号([]),并且这些字符对于默认情况下使用的全局搜索是特殊的。所以我们会逃避它们:string map {[ \\[ ] \\]} $s。另外,从ListB的项目将在listA后缀,所以我们需要预先为“任何角色”预定一个明星,*

如果没有lmap,不希望使用简易替换在lmap (for Tcl 8.5)链接信息:

set result {} 
foreach s $ListB { 
    lappend result [lsearch -inline $listA *[string map {[ \\[ ] \\]} $s]] 
} 
puts $result 

文档: foreachlappendlmap (for Tcl 8.5)lmaplsearch, puts, set, string

Tcl的字符串匹配的语法:

  • *匹配的零个或多个字符的序列
  • ?单个字符
  • [chars]在该组中的单个字符由给出匹配相匹配chars(^ does not negate;一系列可作为AZ
  • \x字符X匹配,即使该字符是特殊的*?[]\(之一)
+0

我们可以用另一种方式做同样的事情,而不必使用lmap ..出于某种原因,我的tcl shell说lmap是一个无效的命令。 –

+1

由于您使用的是较早的Tcl版本,您可以使用'foreach {s} $ ListB {...}'并根据需要处理每个结果。如果可能,建议升级Tcl。 –

+0

@AvasRoy:看文档链接。在第一个链接中,您可以找到一小段代码添加lmap,以便使用它。 –

0

这里有明确的foreach循环的解决方案,以防lmap是无法使用。如果支持基于范围的匹配,它也可以避免水平字符串匹配:

proc endsWidth {s suffix} { 
    set index end-[expr {[string length $suffix]-1}] 
    return [expr {[string range $s $index end] eq $suffix}] 
} 

foreach b $listB { 
    foreach a $listA { 
     if {[endsWidth $a $b]} { 
      puts "$a $b" 
     } 
    } 
}