parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

рекурсия и локальные переменные

Maxx 25.04.2005 16:34

Проблема вот какая:

Есть метод, который возвращает таблицу всех файлов, по указанному
пути, удовлетворяющих маске (if def $mask) и во всех вложенных
каталогоах (if !def $root), а также может список сохранить в файл:
@list_files[path;mask;onlyroot;savepath][list]
^if(!def $mask){
$mask[\.*]
}
^if(-d $path){
        $list[^file:list[$path]]
        ^if($list){
                ^list.menu{
                        ^if((-f "${path}$list.name") && ^list.name.match[$mask]){
                                ^if(def $list_of_files){
                                        $list_of_files[$list_of_files
${path}$list.name]}{
                                        $list_of_files[${path}$list.name]
                                }
                        }
                        ^if(-d "${path}$list.name" && !def $onlyroot){
                                ^list_files[${path}${list.name}/;$mask]
                        }
                }
        }
}
^if(def $savepath){
        ^if(def $list_of_files){
                ^list_of_files.save[$savepath]
        }{
                $no_files[iao oaeeia]
                ^no_files.save[$savepath]
                $result[]
        }
}
^list_of_files.save[tbl.xtxt]
$result[$list_of_files]
Метод лежит в файле func.p, который подключается юзом:
@auto[]
^use[func.p]
^use[stat.p]
Метод вызывается так, например (из stat.p):
$files1[^table::create[nameless]{^list_files[/logs/;\.log^$;;/temp/a.txt}]
метод работет правильно и в таблице files1 те файлы, которые нужны
но если метод вызвать еще раз там же
$files2[^table::create[nameless]{^list_files[/base/;\.log^$}]
то в таблице files2 оказываются и файлы из первого зароса и из
второго. :(

Понимаю, что дело тут в локальных переменных, но так и не смог найти
решения, как $list_of_files сделать локальной, поскольку ф-ция
рекурсивная, то обьявление ее локальной в методе приводит к
неработоспособноти метода...

Помогает вот такое решение, но мне оно кажется некорректным:
$files1[^table::create[nameless]{^list_files[/logs/;\.log^$;;/temp/a.txt}]
$list_of_files[]
$files2[^table::create[nameless]{^list_files[/base/;\.log^$}]
$list_of_files[]