Как добавить переменное количество аргументов в exec в tcl? - PullRequest
7 голосов
/ 16 декабря 2011

Я работаю с TCL в течение некоторого времени, и я потратил много времени, пытаясь сделать следующее (это кажется легким, и я думаю, что так и должно быть, но я не могу понять это правильно):

Мне нужно выполнить внешнюю программу с помощью tcl-скрипта. Для этого я использую команду exec. Для использования этой внешней программы мне нужно ввести переменное количество файлов. Если бы я вызывал эту программу прямо из окна cmd, это было бы что-то вроде:

C:\>myprogram -i file1 -i file2 -i file3 (etc., etc.)

Однако, когда я пытаюсь реализовать это динамически / переменным образом через tcl, у меня возникают проблемы. Я делаю это, сохраняя в некоторой переменной myvar все «-i filex», которые мне нужны (сделано в цикле), а затем передаю это в качестве параметра команде exec. Это будет выглядеть примерно так:

exec myprogram $myvar

Выполнение этого, по-видимому, создает некоторые проблемы, потому что эта myprogram не может "увидеть" myvar. Я предполагаю, что есть какой-то скрытый терминатор или какое-то столкновение различных типов аргументов, что делает в итоге команду exec «видит» только мою программу.

Итак, мой вопрос: кто-нибудь знает, как вставить переменные аргументы в вызов exec?

Ответы [ 2 ]

9 голосов
/ 16 декабря 2011

Вы можете использовать {*} или eval . См. этот вопрос , например.

5 голосов
/ 18 декабря 2011

Специально для вашего случая:

Tcl 8,5 (и позже):

exec myprogram {*}$myvar

Tcl 8,4 (и раньше):

eval [list exec myprogram] [lrange $myvar 0 end]
# Or...
eval [linsert $myvar 0 exec myprogram]

Это верно,старая версия некрасива (или неочевидна, или обе).Из-за этого люди, как правило, вместо этого писали следующее:

eval exec myprogram $myvar

, но это было медленнее, чем ожидалось (ОК, не так актуально при запуске внешней программы!) И имеет опасность, когда $myvar не являетсяКанонически отформатированный список из-за способа работы eval.Раньше он ловил даже опытных программистов на Tcl, и именно поэтому мы ввели новый синтаксис в 8.5, который определен как свободный от неожиданностей и довольно короткий.

...