Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
如何使用TCL regexp打印变量$test,即gig1 port是trunk port?_Tcl - Fatal编程技术网

如何使用TCL regexp打印变量$test,即gig1 port是trunk port?

如何使用TCL regexp打印变量$test,即gig1 port是trunk port?,tcl,Tcl,我是TCL/TK的新手。我想从下面的$test变量检查gig1端口是“trunk”还是“access” set test { interface gig1 switchport mode trunk switchport trunk native vlan 1 no switchport trunk native tagged interface gig2 switchport mode access switchport access vlan 2 no sw

我是TCL/TK的新手。我想从下面的$test变量检查gig1端口是“trunk”还是“access”

set test {
 interface gig1
  switchport mode trunk
  switchport trunk native vlan 1
  no switchport trunk native tagged
 interface gig2
   switchport mode access
   switchport access vlan 2
   no switchport trunk native tagged
 }
如何从上面的变量$test打印,即gig1端口是trunk端口

首先,我想要过滤器“gig1”和之后出现的任何东西

请提出你的想法

谢谢

库马尔

输出将是:

C:\Documents and Settings\Owner\Desktop>tclsh test.tcl
Gig1 port is a trunk port

C:\Documents and Settings\Owner\Desktop>
我希望它对你有用

谢谢

巴鲁p

foreach {a b} [set f 0 ; lmap w $test {
    if {$f} {
        set f 0
        set w
    } else {
        set f [expr {$w in {interface mode}}]
        continue
    }
}] {
    puts "Port $a is a $b port"
}
印刷品

Port gig1 is a trunk port
Port gig2 is a access port
这是通过a)将原始列表映射到只包含紧跟在单词“interface”和“mode”之后的元素的简化列表,然后b)迭代该简化列表,每次取两个单词并将它们放入输出语句中来实现的

lmap
命令遍历列表,通常使用脚本中的当前列表项,为原始列表中的每个项生成一个结果。例如,列表
{a reduced list}
可以映射到由项目的字符串长度组成的列表:

lmap item {a reduced list} {string length $item}
# => {1 7 4}
生成的列表不必像原始列表那样包含很多项。例如,可以生成一个列表,其中仅包含至少三个字符的单词:

lmap item {to a reduced list} {
    if {[string length $item] < 3} {
        continue
    } else {
        set item
    }
}
# => {reduced list}
当且仅当条件为true时,此调用将遍历原始列表并将当前单词附加到结果列表。我们想要的条件是前面的单词是“接口”和“模式”。但是
lmap
只能让我们一次看一个单词!(事实并非如此,见下文。)

假设我们有一个标志变量,
f
,如果前面的单词是查找到的单词之一,它以某种方式包含
true
,否则包含
false

lmap w $test {
    if {$f} {
        set w
    } else {
        continue
    }
}
现在,我们对这个标志变量的值了解多少?好的,它的开头是
false
(在读取任何单词之前,前面没有任何单词),每次我们向结果列表中添加一个单词,它就会变成
false
(我们添加的单词不在查找列表中)。请注意,我使用
0
表示错误:它是Tcl中的合法布尔值

set f 0
lmap w $test {
    if {$f} {
        set f 0
        set w
    } else {
        continue
    }
}
我们什么时候寻找“接口”和“模式”这两个词?每次标志指示
false
。当我们找到他们时会发生什么?我们将标志设置为
true
,这意味着下一个单词将添加到结果列表中

set f 0
lmap w $test {
    if {$f} {
        set f 0
        set w
    } else {
        set f [expr {$w in {interface mode}}]
        continue
    }
}
我本可以在这里使用
if
命令将
f
设置为
1
,但将
f
设置为谓词
expr{$w in{interface mode}
的结果更方便

当我们评估上述内容时,我们得到了列表
{gig1 trunk gig2 access}
。通过将值插入字符串模板,我们可以使其更具可读性:

puts "Port $a is a $b port"
为了实现这一点,我们可以使用
foreach
命令在每次迭代期间挑选一对单词并打印模板

foreach {a b} {gig1 trunk gig2 access} {
    puts "Port $a is a $b port"
}
我们可以将这两部分放在一起,得到一个简化的单词列表并将其打印出来,方法是将
foreach
调用中的列表文字替换为
集合中的代码
+
lmap
脚本中括号内的代码。您得到的是这个答案中的第一个代码部分

我确实说过,
lmap
只允许您在每次迭代中查看一个项目,这是不完全正确的。实际上,您可以查看同一列表或其他列表中的多个项目,这意味着这是可行的:

lmap w1 $test w2 [lrange $test 1 end] {
    if {$w1 in {interface mode}} {
        set w2
    } else {
        continue
    }
}
但这几乎是欺骗


文档:,,,,

您能解释一下这个脚本是如何工作的吗。提前谢谢。非常感谢。。。这是很好的解释。。谢谢
foreach {a b} {gig1 trunk gig2 access} {
    puts "Port $a is a $b port"
}
lmap w1 $test w2 [lrange $test 1 end] {
    if {$w1 in {interface mode}} {
        set w2
    } else {
        continue
    }
}