Я новичок в tcl, и я пытался использовать в команде split, моя цель - получить доступ к пути и удалить номер строки, записанный в temp.txt

//this block was successful    
set f [open wave_test.txt]
set pid [open temp.txt "w+"] 
while {[gets $f line] != -1} {
    if {[regexp {#spg_backref :\s+(.*)} $line all value]} {
        puts $pid $value
    }
}
close $f

//here I have a problem while printing the value of data that doesn't exist 
in the temp.txt file
set data [split $pid "\n"]
puts "the data is $data\n"
close $pid

//I think that there is a problem using " as a token in split command
foreach line $data {
    puts "set my list\n"
    set my_list [split $line ""]
    puts "my_list is $my_list\n"
    set path [lindex $my_list 1]
    set line_num [lindex $my_list 1]
    puts "the path is $path\n"
    puts "the line number is $line_num\n"
}


//I copied some lines from the temp.txt file
"/c/pages/smelamed/glass/var/tests/my_glass/rules/top.txt" 1145
"/c/pages/smelamed/glass/var/tests/my_glass/rules/target.txt" 114
"/c/pages/smelamed/glass/var/tests/my_glass/rules/other.txt" 3

Спасибо!

1
Sapir Melamed 21 Сен 2018 в 22:29

2 ответа

Лучший ответ

В этой строке set data [split $pid "\n"] $ pid - это дескриптор открытого файла "temp.txt", не содержимое файл

Поскольку вы открыли файл w +, вы можете сделать

# write to the file
...
# jump to beginning of file and read it
seek $pid 0
set data [split [read -nonewline $pid] \n]
close $pid
1
glenn jackman 21 Сен 2018 в 19:43

split $line "" означает разделение $line на список отдельных символов. Итак, если у вас есть строка «abc», тогда set mylist [split abc ""] даст {a b c} и lindex $mylist 1 равно 'b'. Просто напишите: set path [lindex $line 0], потому что lindex автоматически интерпретирует $line как список.

Использование split $line может вызвать ошибки, если имя пути содержит пробелы.

Вы также можете рассмотреть возможность lassign $line path line_num установить как path, так и line_num в одной команде.

0
HanT 24 Сен 2018 в 13:21