Regex, чтобы найти файл в Tcl - PullRequest
1 голос
/ 15 ноября 2010

Я никогда не использовал Tcl ранее, однако мне нужно изменить определенный файл для проекта. Я использовал регулярные выражения с Perl, однако я не уверен в синтаксисе с Tcl.

Что я хочу сделать, это позволить пользователю выполнить скрипт и ввести имя файла, который необходимо найти. Я хочу найти файл, как только он найден, и что-то сделать. Итак, вот мой несколько псевдокод.

set file_name [lindex $argv 0]

while(true) {
if { found file } {
 puts "Found file!"
 {
 else { file not found )
 puts "File not found!"

}

Я не уверен, как проверить, был ли файл найден или нет? Я получаю полное имя пользователя от пользователя через вход ...

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Если вы действительно хотите использовать регулярные выражения вместо шаблонов глобусов, периодически получайте список файлов (используя glob) и просматривайте его. Полезно, что lsearch принимает синтаксис регулярных выражений:

# get the regexp:
set file_pattern [lindex $argv 0]

# scan current directory:
while 1 {
    set files [glob -nocomplain *]
    if {[lsearch -regexp $files $file_pattern] < 0} {
        puts "file not found"
    } else {
        puts "file found"
    }
    after 1000 ;# sleep for 1 second
}

Обратите внимание, что в tcl регулярное выражение не имеет специального синтаксиса. Это просто строка.

3 голосов
/ 16 ноября 2010

Ожидаете ли вы, что пользователь введет определенное имя файла или что-то с подстановочными знаками в стиле оболочки? Если последнее, вам нужно использовать команду glob.

Другие могут предложить лучшие методы опроса каталогов, но, возможно:

# a utility procedure for outputting messages
proc log {msg} {puts "[clock format [clock seconds] -format %T] - $msg"}

set file_pattern [lindex $argv 0]
log "looking for $file_pattern"
while {[llength [glob -nocomplain $file_pattern]] == 0} {
    after 30000 ;# sleep for 30 seconds
    log "still waiting"
}
log "found: [join [glob $file_pattern] ,]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...