Tcl 阵列打印不支持通道ID

Tcl 阵列打印不支持通道ID,tcl,Tcl,为什么parray没有channelId就像puts命令一样 什么?通灵?串 在stdout channel ID上的parray打印parray仅用于stdout,而不是特定于任何通道,如puts命令 引用 帕雷arrayName 在标准输出上打印所有 数组arrayName中的元素。ArrayName必须是数组 帕雷的呼叫方可以访问。它可以是局部的,也可以是全局的 要反思parray的功能,您需要阅读文档,尤其是info body、info args和info default 要添加可选的前

为什么parray没有channelId就像puts命令一样

什么?通灵?串


在stdout channel ID上的parray打印

parray
仅用于
stdout
,而不是特定于任何通道,如
puts
命令

引用

帕雷arrayName

在标准输出上打印所有 数组arrayName中的元素。ArrayName必须是数组 帕雷的呼叫方可以访问。它可以是局部的,也可以是全局的


要反思parray的功能,您需要阅读文档,尤其是
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)]
    }
}

最后,
parray
没有更改通道的选项,因为这是一个简单的辅助程序。它不需要处理复杂的情况,因为在几乎所有这些情况下,无论如何,你最好从头重写它

它不是为了写出计算机可读的数组版本;一个简单的
放置$fd[array get theAry]
就更好了。它不用于生成真正的表格输出(有用于从数组创建HTML表格和CSV文件的库,但
parray
两者都不提供)。它只是一个简单的交互式调试工具

另外,在Tcl的过程中,在强制参数之前做可选参数有点尴尬——实际到形式的参数映射器并不是最复杂的——而且在数组名之后已经有一个可选参数,一个用于过滤结果的全局模式


parray
的整个定义如下(您的tcl安装中
parray.tcl
的内容):

该许可证正是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)]
    }
}