Forum Webscript.Ru

Программирование => Perl => Тема начата: Dinara от 08 Января 2002, 14:13:39

Название: Названия массивов
Отправлено: Dinara от 08 Января 2002, 14:13:39
А как создавать динамические названия массивов?

То есть, грубо говоря, надо чтобы в памяти компьютера сидели массивы с названиями
@array1
@array2
@array3
и тд...

Причем вручную такое сделать нельзя, нужна автоматика.
Название: Названия массивов
Отправлено: NeoNox от 08 Января 2002, 15:28:53
@array[$1];
@array[$2];
@array[$3];
Название: Названия массивов
Отправлено: Dinara от 08 Января 2002, 17:00:17
А можно это делать в цикле. Например,
@array[$i]?
Название: Названия массивов
Отправлено: NeoNox от 08 Января 2002, 17:06:10
Конечно!
Для этого и придумано :)
Название: Названия массивов
Отправлено: Dinara от 08 Января 2002, 17:16:09
Почему-то не получается, если писать вот так в цикле:

@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/
Название: эээ
Отправлено: Green Kakadu от 08 Января 2002, 17:57:05
Цитировать
@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];
Название: о, в дополнение
Отправлено: Green Kakadu от 08 Января 2002, 18:03:06
Цитировать
А цель вообще этого огорода - составить список всех подпапок каталога. Например,

http://www.webscript.ru/stories/01/11/09/1956218
к хешу массивов.
Там я извращался с графом, но суть в том, что такая структура использовалась для хранения текущей карты состояний каждого узла.
Название: Названия массивов
Отправлено: Боря Елкин от 08 Января 2002, 22:54:50
Цитировать
А цель вообще этого огорода - составить список всех подпапок каталога. Например,


как насчет реализации дерева через структуры?
Например такое

#$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); #вывод всего дерева

Думаю смсысл понятен, дальше уже можно приложить фантазию.
Название: Названия массивов
Отправлено: Dinara от 08 Января 2002, 23:18:54
Непонятен, я еще с трудом разбираю такие конструкции. :-(((
Название: пока не попробуешь
Отправлено: Green Kakadu от 08 Января 2002, 23:53:17
Цитировать
Непонятен, я еще с трудом разбираю такие конструкции. :-(((

пока не попробуешь... потом в процессе эксплуатации ;) познаешь все плюсы.
Название: Названия массивов
Отправлено: Dinara от 09 Января 2002, 01:00:10
Цитировать
#Процедура обхода дерева с использованием рекурсии
sub out
{
my $dirs=shift;
foreach (@$dirs){
print $_->{dir};
out($_->{link}) if ($_->{link});
}
}

out($dir); #вывод всего дерева


А как это использовать? Допустим, есть каталог относительно скрипта
../dir
Как вытащить из него все подпапки? (всех глубин, а не только последнего уровня)
Название: Названия массивов
Отправлено: Боря Елкин от 10 Января 2002, 10:50:09
Примерно по такому же принципу.

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")); #прочитаем каиталог, запишем в структуру и выведем