Я прочитал ваши комментарии до сих пор, и если я вас правильно понял, ваш файл входных данных имеет 6 (или 9, в зависимости от комментария) полей данных в строке, разделенных пробелами. Вы хотите использовать регулярное выражение, чтобы разбить их на 6 (или 9) массивов или списков, по одному на поле данных.
Если это так, я бы попробовал что-то вроде этого (используя списки):
set f [open $filename]
while {[gets $f line] > -1} {
# Process lines
if {[regexp {(\S+) (\S+) (\S+) (\S+) (\S+) (\S+)} $line -> name source drain gate bulk inst]} {
lappend nameL $name
lappend sourceL $source
lappend drainL $drain
lappend gateL $gate
lappend bulkL $bulk
lappend instL $inst
}
}
close $f
Теперь у вас должен быть набор из 6 списков, по одному на поле, с одной записью в списке для каждого элемента в вашем входном файле. Например, чтобы получить доступ к i-му имени, вы берете $nameL[$i
].
Если (как я подозреваю) ваша основная цель — получить параметры устройства с именем «foo», вы должны использовать такую структуру:
set name "foo"
set i [lsearch $nameL $name]
if {$i != -1} {
set source $sourceL[$i]
} else {
puts "item $name not found."
set source ''
# or set to 0, or whatever "not found" marker you like
}
person
Erik Johnson
schedule
03.04.2011