2017-07-26 1 views
1

So können, sagen, ich habe diese beiden Listen wie folgt:Teilmuster für Elemente passend, die in zwei Listen in TCL sind

ListA enthält:

{{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]}} 

und 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]}} 

Jetzt brauche ich {feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[27]}, um {se_smmu0_soc_rd_dat[27]} zu entsprechen, und andere Elemente von listA sollten mit ihren Gegenstücken inübereinstimmen.

Antwort

0

Sie können es mit

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

Die Idee ist, jedes Element in der Liste ListB und listA für das Element in der Liste suchen zu nehmen. Es gibt Vorbehalte: einige der Artikel in ListB haben Klammern ([]) in ihnen, und diese Zeichen sind speziell für die Glob-Suche, die lsearch standardmäßig verwendet. Also werden wir ihnen entkommen: string map {[ \\[ ] \\]} $s. Auch der Artikel von ListB wird ein Suffix in listA sein, also müssen wir einen Stern, * für "irgendein Zeichen" voranstellen.

Wenn Sie nicht lmap haben und wollen nicht den Drop-in-Ersatz in dem lmap (for Tcl 8.5) Link verwenden:

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

Dokumentation: foreach, lappend, lmap (for Tcl 8.5), lmap, lsearch, puts, set, string

Syntax von Tcl String Matching:

  • * entspricht eine Folge von null oder mehr Zeichen
  • ? entspricht ein einzelnes Zeichen
  • [chars] in dem Satz von gegebenen ein einzelnen Zeichen übereinstimmt Zeichen (^ tut nicht Negate; ein Bereich kann als az)
  • \x entspricht das Zeichen x, auch wenn es ein Zeichen ist das Besonderes (ein *?[]\) mit expliziten foreach Schleifen, falls
+0

Können wir das gleiche auf andere Weise tun, ohne lmap verwenden müssen ..Aus irgendeinem Grund sagt meine tcl-Shell, dass lmap ein ungültiger Befehl ist. –

+1

Da Sie eine ältere Tcl-Version verwenden, können Sie 'foreach {s} $ ListB {...}' verwenden und jedes Ergebnis nach Bedarf verarbeiten. Empfehlen Sie Tcl, wenn möglich, zu aktualisieren. –

+0

@AvasRoy: Sehen Sie sich die Dokumentationslinks an. Beim ersten Link finden Sie einen kurzen Codeschnipsel, der lmap hinzufügt, damit Sie ihn verwenden können. –

0

Hier ist eine Lösung gegeben wird lmap ist Nicht verfügbar. Es vermeidet auch Glob-Stil String-Matching, wenn zugunsten einer Bereich-basierte Übereinstimmung:

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" 
     } 
    } 
} 
Verwandte Themen