我对 format 命令有疑问。我的输出有点像下面这样的集群和不均匀

    24-04-2011    16:07  <DIR>  Administrator
    15-05-2011 16:05 <DIR> confuser
    01-02-2011   20:57  <DIR>  Public

我应该怎么做才能以正确和统一的方式显示输出。都在同一列开始。像这样 :

是的,我使用了这个命令 puts [format {%-s %-4s %-8s} $user\t $date\t $time] 它给了我这样的输出:
Administrator 15-05-2011 16:05
confuser 01-02-2011 20:57
Public 29-01-2011 19:28
TechM 30-04-2011 09:47

我收到的输出是根据第一个字符串中出现的字母数,例如管理员混淆公共(public)技术。所以我需要知道的是如何获得一个不考虑第一个字符串长度的输出并给出一个适当的统一列输出。

最佳答案

廉价的黑客方法是在输出字符串中使用制表符作为分隔符(“\t ”而不是“ ”)。这将适用于少量变化,但不会处理大变化(或围绕当前终端/编辑器选项卡宽度的小变化)。

要正确完成这项工作,您需要首先获得要打印的所有概念行的列表(即,尚未格式化的数据)。然后遍历每一行并计算出每个字段所需的宽度,在整个数据集中取最大值。这样,您就可以为 format 配置格式字符串。这是一个示例(对于 Tcl 8.5),其中所有内容都被格式化为字符串:

proc printColumnarLines {lines} {
    foreach fields $lines {
        set column 0
        foreach field $fields {
            set w [string length $field]
            if {![info exist width($column)] || $width($column) < $w} {
                set width($column) $w
            }
            incr column
        }
    }
    foreach fields $lines {
        set column 0
        foreach field $fields {
            puts -nonewline [format "%-*s " $width($column) $field]
            incr column
        }
        puts ""; # Just the newline please
    }
}

该位置格式字符串中的 * 表示采用另一个参数指定该字段的宽度。不过,你错过它我并不感到惊讶。格式字符串实际上是一种非常密集的微语言,很容易跳过重要的一点。 (对于使用它们的所有其他语言也是如此;很少有人知道你可以用它们做什么。)

你可以用固定的字段集做更智能的事情,其他 % -sequences 也支持 *。请注意,我通常必须通过试验才能得到我想要的(尤其是浮点数......)

关于tcl - 如何在tcl中以统一的方式显示输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7384349/

10-12 12:53
查看更多