阵列打印不支持通道ID

时间:2014-11-28 15:04:00

标签: tcl

为什么parray没有像puts命令那样没有channelId,

  

put?channelId?串

stdout channelId上的parray打印

3 个答案:

答案 0 :(得分:1)

要反省parray所做的事情,您需要阅读info文档,尤其是info bodyinfo argsinfo 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的许可证。如果你愿意,可以躲开。