Вот быстрый и грязный вариант:
set data [list Name $a Age $b]
puts $outfile "<html>\n<body>\n<table>\n<tr>\n
[join [lmap {h _} $data {format <th>%s</th>\n $h}] {}]
</tr><tr>
[join [lmap {_ d} $data {format <td>%s</td>\n $d}] {}]
</tr>\n</table>\n</body>\n</html>"
Такое решение не масштабируется, однако. Это немного лучше сценария создания 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]<$name>\n
incr ::level
uplevel 1 $body
incr ::level -1
append ::html [indent $::level]</$name>\n
}
proc valueElement {name value} {
append ::html [indent $::level]<$name>$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.
Документация: append, close, dict, foreach, format, incr, join, list, lmap (for Tcl 8.5), lmap, open, package, proc, puts, set, string, tdom (package), uplevel
Спасибо за столь необходимой обратной связи, я думаю, что у меня нет v8.6, поэтому появляется сообщение об ошибке, как недопустимое имя команды «Lmap» – CLEX420
@ CLEX420: если у вас есть 8.5, вы можете использовать замену код для lmap, связанный в приведенном выше списке документации. Если нет, foreach и lappend в комбинации выполняют ту же работу. –