Как работает Tcl "переименование файла {*} [glob * tcl] dir /" - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь переместить большое количество файлов, используя Tcl, и наткнулся на выражение: file rename {*}[glob *tcl] dir/, которое отлично работает.Кто-нибудь может объяснить, как работает эта команда или как эта функция называется?

1 Ответ

0 голосов
/ 25 февраля 2019

Это сочетание двух команд и некоторого полезного синтаксиса.

  • glob возвращает список имен файлов, которые соответствуют шаблону, *tcl в вашем случае, илиошибка, если ничего не найдено.Есть несколько вариантов, которые вы можете использовать, чтобы изменить то, что он возвращает, но вы не используете ни один из них;это отлично подходит для вашего случая использования.
  • file rename переименует файлы или переместит файлы вокруг .В частности, когда последний аргумент - это существующее имя каталога, другие аргументы - это файлы (или каталоги), которые будут перемещены в этот каталог.(То, что он перемещает вещи, имеет смысл, если вы знакомы с тем, как работают системные вызовы POSIX.)

Последняя часть головоломки - {*}[], то есть расширение команды , которое запускает команду (в вашем случае это glob *tcl) и использует элементы списка, которые она возвращает, как последовательность аргументов для вызова команды, в которой она используется.Что полезно;нам нужен список имен файлов в этой точке вызова file rename.Нет реального ограничения на количество аргументов, которые можно перемещать таким образом, кроме базовых вещей, таких как память и т. Д.

Префикс {*} (он только особенный в начале слова) можетиспользоваться с другими правильно сформированными способами создания слова Tcl (например, чтение из переменной с $ или литералом с {…}) или даже с составным словом, хотя использование с составными словами обычно является признаком того, чтото, что вы делаете, вероятно, неразумно.


Если у вас старый код Tcl, написанный для Tcl 8.4 или более ранних версий, вы не увидите {*}.Вместо этого вы бы увидели что-то вроде этого:

eval file rename [glob *tcl] dir/
# Or, more properly, one of these horrors:
eval {file rename} [glob *tcl] {dir/}
eval [list file rename] [glob *tcl] [list dir/]
eval [linsert [linsert [glob *tcl] 0 file rename] end dir/]

Они были заведомо неуклюжими, чтобы получить право в хитрых случаях (вызывая множество тонких ошибок).Синтаксис расширения был добавлен в Tcl 8.5 именно для того, чтобы избавиться от всего этого класса проблем.eval все еще существует в современном Tcl, но сейчас, к счастью, редко используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...