День добрый,Странная проблема. Судите сами...
Иначально: Система FreeBSD 4.9. Из портов поставлен TCL8.3 и
библиотека Sqlite 2.8.3 c tcl wrappers.
Пришется скрипт для учета времени работы клиентов в интернете.Исходный текст (err.tcl):
#!/usr/local/bin/tclsh8.4
package require sqlite;
set namedb "/usr/local/Bscript/session.db";set IFNAME [lindex $argv 0]; # Intarface name
set AUTHNAME [lindex $argv 1]; # Authname
set STARTTIME [clock seconds]; # Current timesqlite sesdb $namedb;
sesdb eval {INSERT INTO sestbl (authname, starttime, stoptime, ifname, traffic) VALUES ( $AUTHNAME, $STARTTIME , $STARTTIME, $IFNAME, 0)};
sesdb close;
При запуске скрипта:
$./err.tcl ccc vvvПолучаем следующее:
unrecognized token: "$"
while executing
"sesdb eval {INSERT INTO sestbl (authname, starttime, stoptime, ifname, traffic) VALUES ( $AUTHNAME, $STARTTIME , $STARTTIME, $IFNAME, 0)}"
(file "./err.tcl" line 12)Такое очущение что tcl в конкретном случае отказывается подменять переменные значениями. Причем если вставить строку:
puts "sesdb eval {INSERT INTO sestbl (authname, starttime, stoptime, ifname, traffic) VALUES ( $AUTHNAME, $STARTTIME , $STARTTIME, $IFNAME, 0)}"
подмена в этой строке происходит нормально.
Установка TCL8.4 проблемы не решила.Причем под Windows на AS TCL 8.4 и sqlite3 эти же скрипты работают нормально и подобных проблем не возникает.
Есть ли какие-либо идеи?
С уважением,
Все очень просто - TCL не производит подстановку переменныых в блоке обрамленном {} - этот блок просто считается списком констант.
Но как только вы обрамляете его еще и кавычками "" подстановка происходит - теперь это законная строка ;-)
В Вашем случае правильнее сделать так (замена {} на ""):
sesdb eval "INSERT INTO sestbl (authname, starttime, stoptime, ifname, traffic) VALUES ( $AUTHNAME, $STARTTIME , $STARTTIME, $IFNAME, 0)"
тогда будет все правильно - tcl произведет подстановки и передаст в sqlite правильную строку.
P.S. Не ставьте ; в конце каждой строки скрипта - эт необязательно ;-)
>Все очень просто - TCL не производит подстановку переменныых в блоке обрамленном
>{} - этот блок просто считается списком констант.
>Но как только вы обрамляете его еще и кавычками "" подстановка происходит
>- теперь это законная строка ;-)
>В Вашем случае правильнее сделать так (замена {} на ""):
>sesdb eval "INSERT INTO sestbl (authname, starttime, stoptime, ifname, traffic) VALUES (
>$AUTHNAME, $STARTTIME , $STARTTIME, $IFNAME, 0)"
>тогда будет все правильно - tcl произведет подстановки и передаст в sqlite
>правильную строку.Хм... Действительно. Сие писалось с оглядкой на примеры, приведенные на
www.sqlite.org, а там у них везде используются именно фигурные скобки.
Мне казалось они должны знать толк в TCL, тем более, что tcl wrappers
у них идет вместе с сырцами.>P.S. Не ставьте ; в конце каждой строки скрипта - эт необязательно
>;-)Ну, IMHO, лучше перебдеть, чем недобдеть. С синтаксисом еще
не освоился толком, по этому перестраховываюсь.
Привет.
Столкнулся со схожей проблемой в случае замены подстрок XXKADRXX на переменную $coor (определена ранее) в текстовых файлах .svrfset file_list [glob *.svrf]
foreach F $file_list {
set infile [open $F]
set contents [read $infile]
close $infileset contents [string map {XXKADRXX "$coor"} $contents]
set outfile [open $F w]
puts -nonewline $outfile $contents
close $outfile
}Буду очень благодарен за мнения)