1

私は次のようなリストを持っています

set val [ list Fa2/0/1 Fa2/0/24 Gi1/0/13 Gi1/0/23 Gi1/1/1 Gi2/0/1 ]

今、私はそれをループに入れて、各範囲でいくつかのコマンドを実行したい

お気に入り

set number 0
set pattern 0
foreach n $val {
    if {$pattern == 0} {
        set current $n
        regexp {(.*/)(\d+)} $n - pattern number
        continue
    }

    regexp {(.*/)(\d+)} $n - match1 match2
    if {$match1 == $pattern} {
        #puts "someproc $current - match2"
    }
}

この作業を行うことができません。出力は、見つかった ech ペアまたは特異値のようになるはずです

someproc Fa2/0/1 - 24
someproc Gi1/0/13 - 23
someproc Gi1/1/1 - 1       #for singular values
someproc Gi2/0/1 - 1

編集:次のようなデータのリストがあります:

  Gi3/0/1 Fa2/0/1 Fa2/0/24 Gi1/0/13 Gi1/0/23 Gi1/1/1 Gi2/0/1 Te1/0/1

ここで、各データはcisco swicth の特定の範囲のポートを表しているか、またはGi3/0/これらのタイプであると言えます。次に、すべてのタイプについて、範囲に対していくつかのコマンドを実行する必要があります。上記のリストを再度取得すると、取得できます。Gi2/0/Fa2/0/

somecommand Gi3/0/1 - 1 # there is only one `Gi3/0/` with number 1.
somecommand Fa2/0/1 - 24 # range of `Fa2/0/` is 1 to 24

同様に、

somecommand Gi1/0/13 - 23
somecommand Gi1/1/1 - 1
and so on
4

7 に答える 7

1

配列がどのように機能するかわからない場合は、このコードへの回答として投稿したコードを編集できます。

set number 0
set pattern 0
set current 0
set result [list Gi3/0/1 Fa2/0/1 Fa2/0/24 Gi1/0/13 Gi1/0/23 Gi1/1/1 Gi2/0/1 Te1/0/1]

foreach n [lsort $result] {
  if {$pattern == 0} {
        set current $n
    regexp {(.*/)(\d+)} $n - pattern number
    continue
  }
  regexp {(.*/)(\d+)} $n - match1 match2
    if {$match1 == $pattern} {
        set number $match2
    } else {
        puts "$current - $number"
        set pattern $match1
        set number $match2
        set current $n
    }
}

それは私のために働く:)

$number出力(最初にリストをソートしたことに注意してください。そのため、増加することだけを心配する必要があり$match2ます$pattern

Fa2/0/1 - 24
Gi1/0/13 - 23
Gi1/1/1 - 1
Gi2/0/1 - 1
Gi3/0/1 - 1
于 2013-04-25T17:41:47.203 に答える
1

これは配列を使用しない私のソリューションです(配列に問題はありません。私のソリューションはそれを必要としません)。これは1回のパスで実行されます(つまり、1回のループのみ)。

set val [ list Fa2/0/1 Fa2/0/24 Gi1/0/13 Gi1/0/23 Gi1/1/1 Gi2/0/1 ]
set lastPattern ""
set lastNumber 0
lappend val x/1/1; # Add a trailer to ease processing

foreach item $val {
    # If item=Fa2/0/1, then pattern=Fa2/0 and number=1
    set pattern [file dirname $item]
    set number  [file tail $item]

    if {$pattern == $lastPattern} {
        # We have seen this pattern before
        puts "$pattern/$lastNumber - $number"
        set lastPattern ""
    } else {
        # This is a new pattern, print the old one if applicable then
        # save the pattern and number for later processing
        if {$lastPattern != ""} {
            puts "$lastPattern/$lastNumber - $lastNumber"
        }
        set lastPattern $pattern
        set lastNumber $number
    }
}
set val [lrange $val end-1]; # Remove the trailer
于 2013-04-25T20:14:30.757 に答える
1
#!/usr/bin/tcl

## Assumptions:
## The pattern will always be X/X/X
##  The values are given in list
set val_list [list Fa2/0/1 Fa2/0/24 Gi1/0/13 Gi1/0/23 Gi1/1/1 Gi2/0/1]

array set pattern {}

foreach item $val_list {
set parent [file dir $item]
set val [file tail $item]
if {[info exists pattern($parent,L)] && [info exists pattern($parent,H)]  } {
    if {$pattern($parent,L) > $val } {
    set pattern($parent,L) $val
    } elseif { $pattern($parent,H) < $val} {
    set pattern($parent,H) $val
    }
} else {  
    set pattern($parent,L) $val
    set pattern($parent,H) $val 
}
}
array set count {}
foreach pat  [array names pattern] {
set pat [lindex [split $pat ,] 0]
if {![info exists count($pat)] } {
    puts "$pat $pattern($pat,L) - $pattern($pat,H)"
    set count($pat) 1
}
}


/*The output will be 
Gi1/0 13 - 23
Fa2/0 1 - 24
Gi2/0 1 - 1
Gi1/1 1 - 1
*/

これがあなたが求めているものであることを願っています。配列「カウント」を使用して、回避する必要がある出力の重複エントリを削除しました。誰かがより良い方法を提案できることを願っています。参考までに、TCL の 8.4 バージョンを使用しています。

于 2013-04-25T12:36:31.200 に答える
0

リストのペアをループしてみませんか?

foreach {v1 v2} $val {
     someproc $v1 $v2
}

両方の値が似ているかどうかを確認したり、必要な部分を抽出したりできます。

于 2013-04-25T08:02:22.027 に答える
0

このソリューションは少し短くなりますが、Tcl 8.5 が必要です。

最初に、最初の 2 つのフィールドをキーとサブキーとしてディクショナリ構造を作成し、3 番目のフィールドから値のリストをディクショナリ値として収集します。

set data {}
foreach v $val {
    lassign [split $v /] a b c
    if {![dict exists $data $a $b]} {
        dict set data $a $b {}
    }
    dict with data $a {
        lappend $b $c
        set b [lsort –integer $b]
    }
}

次に、このディクショナリ構造を繰り返し処理しsomeproc、キー、サブキー、最初と最後の値の組み合わせごとにコマンドを呼び出します。

dict for {a v} $data {
    dict for {b v} $v {
        someproc $a/$b/[lindex $v 0] - [lindex $v end]
    }
}

ドキュメント: dictforeachiflappendlassignlindexsetsplit

于 2016-04-25T11:03:08.570 に答える