2017-07-26 52 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" 
     } 
    } 
} 
相關問題