URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4061
[ Назад ]

Исходное сообщение
"Подстановка переменных TCL при использовании SQLite"

Отправлено northbear , 13-Мрт-05 19:18 
День добрый,

Странная проблема. Судите сами...

Иначально: Система 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 time

sqlite 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 при использовании SQLite"
Отправлено MaximKuznetsov , 14-Мрт-05 05:32 
Все очень просто - TCL не производит подстановку переменныых в блоке обрамленном {} - этот блок просто считается списком констант.
Но как только вы обрамляете его еще и кавычками "" подстановка происходит - теперь это законная строка ;-)
В Вашем случае правильнее сделать так (замена {} на ""):
sesdb eval "INSERT INTO sestbl (authname, starttime, stoptime, ifname, traffic) VALUES ( $AUTHNAME, $STARTTIME , $STARTTIME, $IFNAME, 0)"
тогда будет все правильно - tcl произведет подстановки и передаст в sqlite правильную строку.
P.S. Не ставьте ; в конце каждой строки скрипта - эт необязательно ;-)


"Подстановка переменных TCL при использовании SQLite"
Отправлено northbear , 14-Мрт-05 12:27 
>Все очень просто - 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, лучше перебдеть, чем недобдеть. С синтаксисом еще
не освоился толком, по этому перестраховываюсь.


"Подстановка переменных TCL при использовании SQLite"
Отправлено Антон , 06-Июл-11 10:35 
Привет.
Столкнулся со схожей проблемой в случае замены подстрок XXKADRXX на переменную $coor (определена ранее) в текстовых файлах .svrf

set file_list [glob *.svrf]

foreach F $file_list {

set infile [open $F]
set contents [read $infile]
close $infile

set contents [string map {XXKADRXX "$coor"} $contents]
set outfile [open $F w]
puts -nonewline $outfile $contents
close $outfile
}

Буду очень благодарен за мнения)