2016-10-19 8 views
-1

У меня есть код, который выглядит так:TCL подстановочное/использование Глоба в имени файла

... 
proc myProc {first last} { 
    for { set i $first } { $i <= $last } { incr i } { 
     set i_cur "PlainText$i" 
     <command> [glob ./../myDir/${i_cur}*] 
    } 
} 

Когда я запускаю это, любой файл, который не имеет ничего после номера будет работать нормально. Но если есть что-то после номера, то это не так. Например, у меня есть действительные файлы с именем PlainText0.txt, PlainText00.txt и PlainText1_Plaintext.txt. Первые две работы и PlainText1_Plaintext.txt нет.

В принципе, я не думаю, что правильно использую шаблон glob/wildcard, но не знаю, как это сделать.

+2

Работы для меня. работает правильно при передаче нескольких имен файлов? –

+0

@BradLanam, если я удаляю весь текст после номера (т. Е. Изменяю 'text1_stuff.txt' на' text1.txt', то он работает как шарм и выполняет итерации по всем моим файлам. Если я этого не сделаю, не процесс). Если я переименую часть из них, он корректно выполняет итерацию, хотя и переименован, и не работает с непереименованными и включенными. – Raj

ответ

0

Обычные проблемы, связанные с такого рода вещи, когда вы уже получили Glob за то, что вы хотите, не так, или когда у вас есть команда, которая нуждается в список возвращенное glob расширен.

Если это то, что команда нуждается в список расширен, вам нужно использовать:

<command> {*}[glob ...] 

Это {*} перед скобкой расширяет результаты на несколько аргументов. Иногда это вместо того, требует, чтобы перебрать результаты и передать их в один, в то время:

foreach filename [glob ...] { 
    <command> $filename 
} 

Когда дело доходит до самого Glob, вы не совсем ясно, будет ли PlainText1_stuff.txt приемлемо для вас или нет. Однако он соответствует шаблону PlainText1*. Если это неприемлемо, возможно, вам нужно PlainText1.*; дополнительный . важен для того, что здесь соответствует.

Кроме того, рекомендуется использовать опцию -directory в glob, как это делает ваш код более понятным (особенно если вы на одной из платформ, что позволяет Глоб метасимволов в именах файлов).


В целом, вы, возможно, глядя на что-то вроде этого:

<command> {*}[glob -directory ../myDir PlainText$i.*] 

Вы можете использовать переменную помощника, если вы хотите.

+1

Возможно, опция «-nocomplain» будет применима. –

+0

@Donal Fellows, Чтобы выяснить, действительно ли 'PlainText1_stuff.txt', я обновил вопрос. Это: У меня есть все файлы, которые я хочу в каталоге, и могу выполнять итерацию и запуск моего (что относится к конкретному приложению, например, QuestaSim добавляет файл в проект и компилирует исходный файл RTL), все файлы без дополнительных символов после работы числа и всех файлов с символами после этого нет. Все файлы действительны и должны работать. – Raj

+1

Затем перейдите к файлу foreach [glob ... "PlainText *"] {do_something_with $ file}. Если вы получите больше файлов, то вы хотели, маску маска для макета для glob, или используйте [string match] или [regexp], чтобы проверить файл $ file дальше. –