чтение файла с "[" и манипулирование каждой строкой TCL - PullRequest
0 голосов
/ 10 октября 2019

У меня есть файл со строками ниже (file.list) :

insert_buffer [get_ports { port }] BUFF1 -new_net  net -new_cell cell

Я читаю файл с приведенным ниже сценарием (read.tcl) :

    #! /usr/local/bin/tclsh
foreach arg $argv {

set file [open $arg r]
set data [ read $file ]

foreach line  [ split $data "\n" ] {

puts $line

set name [lindex $line [expr [lsearch -all $line "-new_cell"]+1]]
puts $name
}

close $file

} 

во время выполнения вышеуказанного сценария (read.tcl file.list) Я получаю ошибку, так как у меня есть "[" в file.list и сценарий считает его началомкоманды TCL.

list element in braces followed by "]" instead of space
    while executing
"lsearch -all $line "-new_cell""
    ("foreach" body line 5)
    invoked from within
"foreach line  [ split $data "\n" ] {

Как правильно прочитать файл и преодолеть символ "[" ?

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Как правильно прочитать файл и преодолеть символ "["?

Я не совсем понимаю, почему вы делаете то, что делаете (обрабатываете один сценарий Tcl с помощьюдругой), но вы должны убедиться, что каждая строка является допустимым списком Tcl, прежде чем отправлять его на lsearch.

lsearch -all [split $line] "-new_cell"

Только split превратит произвольную строку (содержащую символы, специальные для Tcl)в действительный список Tcl.

0 голосов
/ 11 октября 2019

Чтобы применить операцию со списком к переменной, это должен быть допустимый список. Переменная $line не является допустимым списком.

Лучше использовать regexp, чем lsearch

regexp -- {-new_cell\s+(\S+)} $x match value
puts $value

Вывод:

cell
0 голосов
/ 10 октября 2019

Это один из немногих случаев в Tcl, когда вам нужно беспокоиться о том, какой тип данных у вас есть. $line содержит строку . Не используйте команды списка для строк , поскольку нет гарантии, что произвольная строка является правильно сформированным списком.

Сделайте это:

set fields [split $line]
# don't use "-all" here: you want a single index, not a list of indices.
set idx [lsearch -exact $fields "-new_cell"]
if {$idx == -1} {
    do something here if there's no -new_cell in the line
} else {
    set name [lindex $fields $idx+1]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...