Сначала прочитайте файл и извлеките слова из первых двух строк:
set f [open "f.txt"]
set words1 [regexp -all -inline {\S+} [gets $f]]
set words2 [regexp -all -inline {\S+} [gets $f]]
close $f
Хитрость в том, что regexp -all -inline
возвращает все соответствующие подстроки, а \S+
выбирает не-пробельные последовательности символов.
Затем, поскольку мы производим табличный вывод, нам нужно измерить максимальный размер элементов в первом списке.Мы могли бы также измерить второй список одновременно.
set len1 [tcl::mathfunc::max {*}[lmap w $words1 {string length $w}]]
set len2 [tcl::mathfunc::max {*}[lmap w $words2 {string length $w}]]
lmap
применяет string length
к каждому слову, и затем мы находим максимум из них.{*}
заменяет список (длин слов) несколькими аргументами.
Теперь мы можем перебрать два списка и создать форматированный вывод:
foreach w1 $words1 w2 $words2 {
puts [format "%-*s %-*s" $len1 $w1 $len2 $w2]
}
Последовательность формата %-*s
использует два аргумента, один из которых представляет собой длину поля, а другой - строку, которая должна быть помещена в это поле.Выравнивание по левому краю в поле и отступы справа пробелами.Без -
это выровняло бы по правому краю;это более полезно для целых чисел.Вместо этого вы можете использовать символы табуляции для разделения, что обычно хорошо работает, если слова короткие, но не так хорошо, когда вы получаете более широкое сочетание длин.
Если выпытаясь создать фактический файл значений, разделенных табуляцией, пакет csv
в Tcllib сгенерирует их с правильными (очевидными!) опциями.