2014-09-24 2 views
1

Я открываю программу оболочки из tcl с открытой командой, выходной файл оболочки имеет несколько строк и команд tcl по строкам. Может ли сказать мне, как печать, если строка представляет собой список строк и как оценить, если линия команды TCLЧтение файла из Запуск других программ от Tcl

Я использовал следующий sytnax, но он пытается преобразования приложений струны также,

set fileID [open "| unix ../filename_1" r+] 
    while 1 { 
    set line [gets $fileID] 
    puts "Read line: $line" 
    if {$line == "some_text"} { puts $line #text 
    } elseif { $line == "cmd"} {set j [eval $line] #eval cmd } 

}

ответ

1

Вы можете попробовать это (проверено)

принципа: первое слово каждой строки проверяется, чтобы увидеть, если он принадлежит к списку команд TCL, , который был первым полученным «Информация команды».

Иногда вы не можете правильно получить первое слово, поэтому эта команда находится в catch {}.

set fileID [open myfile] 
set cmdlist [info commands] 
while {1} { 
    set readLine [gets $fileID] 
    if { [eof $fileID]} { 
     break 
    } 
    catch {set firstword [lindex $readLine 0] } 
    if { [lsearch $cmdlist $firstword] != -1 } { 
     puts "tcl command line : $readLine" 
    } else { 
     puts "other line : $readLine" 
    } 
} 
+0

Спасибо Abenhurt, приведенный выше код работает. Мне нужно сначала напечатать строки в tcl, а затем выпустить команду tcl. – user3069844

+0

+1. У меня было несколько комментариев о вашем коде, поэтому я добавил ответ вики сообщества. –

1

Полный кредит для abendhurt. Переписав его ответ на более идиоматических Tcl:

set fid [open myfile] 
set commands [info commands] 
while {[gets $fid line] != -1} { 
    set first [lindex [split $line] 0] 
    if {$first in $commands} { 
     puts "tcl command line : $line" 
    } else { 
     puts "other line : $line" 
    } 
} 

Примечания:

  • использование while {[gets ...] != -1} чтобы сократить код немного. не
  • использование split для преобразования строки в надлежащий список - больше не нужно catch
  • использовать встроенный in оператора для улучшения читаемости.

Я думаю, что я понимаю:

set fid [openopen "| unix ../filename_1" r] 
set commands [info commands] 
set script [list] 
while {[gets $fid line] != -1} { 
    set first [lindex [split $line] 0] 
    if {$first in $commands} { 
     lappend script $line 
    } 
    puts $line 
} 
eval [join $script ;] 
+0

Спасибо glen jackman, мне нужен следующий waay ex: myfile может иметь lin1: AAAA lin2: BBBB lin3: cmd1 lin4: CCCC ,,,, so on print output :: AAAA BBBB cmd1 CCCC ,,,, после выполнения tcl_cmd :: eval cmd1 – user3069844

+0

Я не понимаю. Отсутствие форматирования в комментариях. Пожалуйста, обновите свой вопрос. –

+0

входного файла (комбинация строк и команд): AAAA #text BBBB #text cmd1 # Eval команды TCL DDDD #text Cmd2 ..... TCL Выход: AAAA BBBB cmd1 DDDD cmd2 .... eval: cmd1 eval: cmd2 eval: ... – user3069844

Смежные вопросы