LINUX.ORG.RU

[Tcl] Как убрать кавычки?

 


0

0
if {[catch {open $backupList r} fID]} {
    puts stderr "Could not open $someFile for writing\n$fID"
    exit 1
}

foreach path [read $fID] {
    set backupDirs("[lindex [split $path /] end]") $path
}
close $fID

foreach {dir path} [array get backupDirs] {
    set backupName \
        [format "%s-%s" [clock format [clock seconds] -format "%Y%m%d"] $dir]
    puts $backupName
}
TCL-USER> 
20081222-"home"
20081222-"pub"
20081222-"pictures"
20081222-"develop"

Как видно из ^^^, на выходе надо как-то убрать кавычки. Как?

ps вам не кажется, что Tcl немного многословен?

anonymous

Первое что пришло в голову, не проверено - заменить $dir в третей с конца строчке на [string range $dir 1 end-1]

naryl ★★★★★
()
Ответ на: комментарий от naryl

> заменить $dir в третей с конца строчке на [string range $dir 1 end-1]

Как-то... хотелось бы что-нибудь попроще и покороче.

anonymous
()
Ответ на: комментарий от anonymous

Можно чуть проще и короче. Решение не слишком очевидное, в народе именуемое хаком.
[lindex $dir 0]

Ещё можно попробовать дождаться jtootf. :)

naryl ★★★★★
()
Ответ на: комментарий от naryl

>Ещё можно попробовать дождаться jtootf. :)

Я за него :)

А зачем тебе вообще кавычки в ("[lindex [split $path /] end]") ?

Если пробелы в имени файла, то проблемы начнутся гораздо раньше -- в foreach разбивка произойдёт по словам, а не по строкам.

А если пробелов не бывает, то и кавычки в set не нужны.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

> А зачем тебе вообще кавычки в ("[lindex [split $path /] end]") ?

хм, действительно помогло. Я что-то подумал они нужны... начинающий tcler я :)

> Если пробелы в имени файла

Не, пробелов у меня не бывает.

anonymous
()
Ответ на: комментарий от anonymous

Только хотел сказать, что если какой-то злонамеренный юзер подложит файл с переводом строки в имени, то "Будит беда" (С).

Но раз даже пробелов нет, то ок.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

> Только хотел сказать, что если какой-то злонамеренный юзер подложит файл с переводом строки в имени, то "Будит беда" (С).

Это, в принципе, потом можно продумать, пока я делаю простой скриптик для создания бекапов.

anonymous
()

> foreach path [read $fID] {

Welcome to braces hell! Правильнее будет [ split [ read $fID ] "\n" ], т.к. у тебя программа сломается, если в файле будет одинокая открывающая фигурная скобка '{'.
Кстати, попробуй так сделать, чтобы наступить единожды на эти грабли и потом на них не вставать :)

>     set backupDirs("[lindex [split $path /] end]") $path

^^^ Вот отсюда эти кавычки и лезут

> ps вам не кажется, что Tcl немного многословен?


Не кажется.

gaa ★★
()

я чувствую себя лишним на этом празднике жизни :)

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

>> [ file tail $path ] -- так короче

век живи, век учись :)

>А есть ли моды для имакса, чтобы в контексте Tcl выставлять парные скобки, кавычки и пр?

ищи тут -- http://wiki.tcl.tk/2153

Vadim_Z
()

if [ catch {
   # под catch убираются ВСЕ файловые операции
   # и неправильное чтение списка тоже :)
   foreach path [ read [ set fd [ open $backupList "r" ] ] ] {
      set backupDirs([file tail $path]) $path
   }
   close fd
} ] {
   exit 1
}
# момент определяется ОДИН раз..а то попадёте на 23:59.40 
set now [clock format [clock seconds] -format "%Y%m%d"]
foreach dir [ array names backupDirs ] {
  puts [ set backupName "$now-$dir" ]
}

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

В данном коде catch сильнее мешает, чем помогает. Если его не писать, при проблемах с файлами вылетет эксцепшн с полным стектрейсом, чтобы можно было понять, где ошибка. В данном же случае программа тихо завершится с ненулевым кодом и всё.

gaa ★★
()
Ответ на: комментарий от gaa

Но пользователи почему-то пугаются, когда видят много незнакомых слов на чуждом языке. Так что лучше все-таки catch.

anonymous
()
Ответ на: комментарий от anonymous

> Но пользователи почему-то пугаются, когда видят много незнакомых слов на чуждом языке. Так что лучше все-таки catch.

Тогда в катче надо писать локализованное сообщение об ошибке, а не тихо завершаться.

gaa ★★
()
Ответ на: комментарий от gaa

2gaa

> Тогда в катче надо писать локализованное сообщение об ошибке, а не тихо завершаться.

а вы ожидаете, что в форуме вам дадут production вариант кода ? тут просто демонстрируют подход/возможное решение и проч., максимально кратко..автор сам должен беспокоится о том что ему делать с исключениями. Кстати обратите внимание на саму задачу - "бекап", она из класса задач которые либо отрабатывают полностью, либо тихо завершается с кодом ошибки.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> а вы ожидаете, что в форуме вам дадут production вариант кода ? тут просто демонстрируют подход/возможное решение и проч., максимально кратко..автор сам должен беспокоится о том что ему делать с исключениями.

Я ожидаю!? Я просто даю советы по ходу дела.

> Кстати обратите внимание на саму задачу - "бекап", она из класса задач которые либо отрабатывают полностью, либо тихо завершается с кодом ошибки.


Странно, все бэкапные скрипты, которые я видел всегда были очень разговорчивы.

gaa ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.