这里是一个快速和肮脏的变种:
set data [list Name $a Age $b]
puts $outfile "\n
\n[join [lmap {h _} $data {format
%s\n $h}] {}][join [lmap {_ d} $data {format
%s\n $d}] {}]\n\n\n"这种解决方案不结垢,但是。这是一个好一点的脚本的HTML代码的创建,更容易使其常规:
set a Reynard
set b 12
set data [list Name $a Age $b]
set level 0
set html {}
proc indent n {
string repeat { } $n
}
proc structuralElement {name body} {
append ::html [indent $::level]\n
incr ::level
uplevel 1 $body
incr ::level -1
append ::html [indent $::level]$name>\n
}
proc valueElement {name value} {
append ::html [indent $::level]$value$name>\n
}
structuralElement html {
structuralElement body {
structuralElement table {
structuralElement tr {
foreach {h _} $data {valueElement th $h}
}
structuralElement tr {
foreach {_ d} $data {valueElement td $d}
}
}
}
}
set outfile [open "result_cell_pin.html" w+]
puts $outfile $html
close $outfile
但没有必要推倒重来。最简单的方法可能是使用tDOM。它看起来很凌乱,但当你习惯了它时非常流畅:
package require tdom
set doc [dom createDocument html]
set root [$doc documentElement]
dom createNodeCmd elementNode body
dom createNodeCmd elementNode table
dom createNodeCmd elementNode tr
dom createNodeCmd elementNode th
dom createNodeCmd elementNode td
dom createNodeCmd textNode t
set a Reynard
set b 12
set data [list Name $a Age $b]
$root appendFromScript {
body {
table {
tr {
dict for {h _} $data {th {t $h}}
}
tr {
dict for {_ d} $data {td {t $d}}
}
}
}
}
set outfile [open "result_cell_pin.html" w+]
puts $outfile [$doc asXML]
close $outfile
$doc delete
为什么要麻烦脚本呢?有很多原因,例如更容易做到,维护起来更容易。一个主要的优点是,当规格改变时适应脚本要容易得多。假设您现在在a和b中有多个值,您需要在表中的多行中显示该值。重写第一个代码示例是一件麻烦事,但重写tdom脚本是一件轻而易举的事情:
set a {Reynard Antimony Jones}
set b {12 16 3.7e09}
set data [list Name $a Age $b]
$root appendFromScript {
body {
table {
tr {
dict for {h _} $data {th {t $h}}
}
foreach d1 $a d2 $b {
tr {
td {t $d1}
td {t $d2}
}
}
}
}
}
不要害怕软件包。 Tcl是一种小内核语言,其中很多其他语言内置的功能都存储在软件包中。在语言X中使用高级文件处理函数和加载fileutil程序包以在Tcl中使用相同的命令之间没有真正的区别。