Forum Webscript.Ru
Программирование => Perl => Тема начата: Dinara от 08 Января 2002, 14:13:39
-
А как создавать динамические названия массивов?
То есть, грубо говоря, надо чтобы в памяти компьютера сидели массивы с названиями
@array1
@array2
@array3
и тд...
Причем вручную такое сделать нельзя, нужна автоматика.
-
@array[$1];
@array[$2];
@array[$3];
-
А можно это делать в цикле. Например,
@array[$i]?
-
Конечно!
Для этого и придумано :)
-
Почему-то не получается, если писать вот так в цикле:
@listing[$i] = readdir MAINDIR;
Пятисотая ошибка.
А цель вообще этого огорода - составить список всех подпапок каталога. Например,
../home/dir/
../home/dir/dir2/
../home/dir/dir3/dir2/dir1/
../home/dir/dir2/dir3/
../home/dir/dir4/dir6/
../home/dir/dir5/
-
@array[$1];
@array[$2];
а может лучше хеш массивов создавать:
my %hash=(
\'array1\'=>[1,2,3,4,\'вася\'],
\'array2\'=>[\'маша\', \'саша\'],
....
\'arrayn\'=>[\'text\', \'text2\']);
Т.е. сами массивы можно перебирать как ключи, создавать новые и т.д. мне кажется удобно...
можно и автоматизировать заполнение ;)
Цикл по элементам определенного массива:
foreach my $elm(@{$hash{\'array1\'}}){
print $elm;
}
доступ к определенному эл-ту, определенного массива:
$hash{\'array\'}[1];
-
А цель вообще этого огорода - составить список всех подпапок каталога. Например,
http://www.webscript.ru/stories/01/11/09/1956218
к хешу массивов.
Там я извращался с графом, но суть в том, что такая структура использовалась для хранения текущей карты состояний каждого узла.
-
А цель вообще этого огорода - составить список всех подпапок каталога. Например,
как насчет реализации дерева через структуры?
Например такое
#$element{dir}="dir"; каталог
#$element{link}=""; ссылка на дочерний элемент
#Структура - дерево можно формировать автоматически
my $dir=[
{dir=>"dir1",
link=>[
{dir=>"subdir1",
link=>[
{dir=>"subdir1_1",
link=>[]
}
]
}
]
},
{dir=>"dir2",
link=>[]
}
]
#Процедура обхода дерева с использованием рекурсии
sub out
{
my $dirs=shift;
foreach (@$dirs){
print $_->{dir};
out($_->{link}) if ($_->{link});
}
}
out($dir); #вывод всего дерева
Думаю смсысл понятен, дальше уже можно приложить фантазию.
-
Непонятен, я еще с трудом разбираю такие конструкции. :-(((
-
Непонятен, я еще с трудом разбираю такие конструкции. :-(((
пока не попробуешь... потом в процессе эксплуатации ;) познаешь все плюсы.
-
#Процедура обхода дерева с использованием рекурсии
sub out
{
my $dirs=shift;
foreach (@$dirs){
print $_->{dir};
out($_->{link}) if ($_->{link});
}
}
out($dir); #вывод всего дерева
А как это использовать? Допустим, есть каталог относительно скрипта
../dir
Как вытащить из него все подпапки? (всех глубин, а не только последнего уровня)
-
Примерно по такому же принципу.
sub readdirs #читаем дерево каталога
{
my $dir=shift;
opendir(DIR, $dir);
my @dirs;
foreach(readdir(DIR)){
next if m/^\\.\\.?$/;
next unless -d "$dir/$_";
$dirs[@dirs]={dir=>$_,link=>${\\(readdirs("$dir/$_"))}};
}
return \\@dirs;
}
out(readdirs("../dir")); #прочитаем каиталог, запишем в структуру и выведем