The OpenNET Project / Index page

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




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

    • Подстановка переменных TCL при использовании SQLite, !*! northbear, 12:27 , 14-Мрт-05 (2)
      >Все очень просто - 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, !*! Антон, 10:35 , 06-Июл-11 (3)
        Привет.
        Столкнулся со схожей проблемой в случае замены подстрок 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
        }

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




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

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