为什么parray没有像puts命令那样没有channelId,
put?channelId?串
stdout channelId上的parray打印
答案 0 :(得分:1)
要反省parray
所做的事情,您需要阅读info
文档,尤其是info body
,info args
和info default
。
要添加可选的前导参数,您需要根据收到的参数数量进行一些检查,例如:
proc parray {args} {
set chan stdout
set pattern *
switch [llength $args] {
1 { set a [lindex $args 0] }
2 {
if {[lindex $args 0] in [chan names]} {
lassign $args chan a
} else {
lassign $args a pattern
}
}
3 { lassign $args chan a pattern }
default {
error {wrong # args: should be "parray ?channelId? a ?pattern?"}
}
}
upvar 1 $a array
if {![array exists array]} {
error "\"$a\" isn't an array"
}
set maxl 0
set names [lsort [array names array $pattern]]
foreach name $names {
if {[string length $name] > $maxl} {
set maxl [string length $name]
}
}
set maxl [expr {$maxl + [string length $a] + 2}]
foreach name $names {
set nameString [format %s(%s) $a $name]
puts $chan [format "%-*s = %s" $maxl $nameString $array($name)]
}
}
答案 1 :(得分:0)
parray
只能在stdout
上编写,并非特定于puts
命令等任何渠道。
从here
引用手册页parray arrayName
在标准输出上打印所有的名称和值 数组arrayName中的元素。 ArrayName必须是数组 parray的来电者可以访问。它可以是本地的也可以是全球的。
答案 2 :(得分:0)
最终,parray
无法更改频道,因为它是简单帮助程序。它不需要处理复杂的情况,因为在几乎所有这些情况下,你最好还是从头开始重写它。
它不是用于编写计算机可读版本的数组;一个简单的puts $fd [array get theAry]
就好了。它不是用于生成真正的表格输出(有用于从数组创建HTML表和CSV文件的库,但parray
都没有)。它只是一个简单的交互式调试工具。
另外,在使用Tcl程序的强制参数之前做可选参数有点尴尬 - 实际到形式的参数映射器不是最复杂的 - 并且已经是可选参数在数组名称之后,用于过滤结果的glob模式。
parray
的整个定义就是这个(Tcl安装中parray.tcl
的内容):
# parray:
# Print the contents of a global array on stdout.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
proc parray {a {pattern *}} {
upvar 1 $a array
if {![array exists array]} {
return -code error "\"$a\" isn't an array"
}
set maxl 0
set names [lsort [array names array $pattern]]
foreach name $names {
if {[string length $name] > $maxl} {
set maxl [string length $name]
}
}
set maxl [expr {$maxl + [string length $a] + 2}]
foreach name $names {
set nameString [format %s(%s) $a $name]
puts stdout [format "%-*s = %s" $maxl $nameString $array($name)]
}
}
许可证正好是Tcl的许可证。如果你愿意,可以躲开。