как правильно использовать в команде split в tcl - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в 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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

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

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

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

0 голосов
/ 21 сентября 2018

В этой строке 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
...