The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Подстановка переменных TCL при использовании SQLite"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Tcl/Tk)
Изначальное сообщение [ Отслеживать ]

"Подстановка переменных TCL при использовании SQLite"  +/
Сообщение от northbear email(ok) on 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 эти же скрипты работают нормально и подобных проблем не возникает.

Есть ли какие-либо идеи?

С уважением,

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Подстановка переменных TCL при использовании SQLite"  +/
Сообщение от MaximKuznetsov on 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. Не ставьте ; в конце каждой строки скрипта - эт необязательно ;-)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Подстановка переменных TCL при использовании SQLite"  +/
Сообщение от northbear email(??) on 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, лучше перебдеть, чем недобдеть. С синтаксисом еще
не освоился толком, по этому перестраховываюсь.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Подстановка переменных TCL при использовании SQLite"  +/
Сообщение от Антон (??) on 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
}

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру