Автор Тема: Названия массивов  (Прочитано 4537 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Названия массивов
« : 08 Января 2002, 14:13:39 »
А как создавать динамические названия массивов?

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

Причем вручную такое сделать нельзя, нужна автоматика.
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Названия массивов
« Ответ #1 : 08 Января 2002, 15:28:53 »
@array[$1];
@array[$2];
@array[$3];
The documentations is your friend

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Названия массивов
« Ответ #2 : 08 Января 2002, 17:00:17 »
А можно это делать в цикле. Например,
@array[$i]?
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Названия массивов
« Ответ #3 : 08 Января 2002, 17:06:10 »
Конечно!
Для этого и придумано :)
The documentations is your friend

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Названия массивов
« Ответ #4 : 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

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
эээ
« Ответ #5 : 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];
« Последнее редактирование: 08 Января 2002, 18:07:54 от Green Kakadu »
 в исканиях.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
о, в дополнение
« Ответ #6 : 08 Января 2002, 18:03:06 »
Цитировать
А цель вообще этого огорода - составить список всех подпапок каталога. Например,

http://www.webscript.ru/stories/01/11/09/1956218
к хешу массивов.
Там я извращался с графом, но суть в том, что такая структура использовалась для хранения текущей карты состояний каждого узла.
 в исканиях.

Оффлайн Боря Елкин

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://webmetr.pips.ru
Названия массивов
« Ответ #7 : 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

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Названия массивов
« Ответ #8 : 08 Января 2002, 23:18:54 »
Непонятен, я еще с трудом разбираю такие конструкции. :-(((
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
пока не попробуешь
« Ответ #9 : 08 Января 2002, 23:53:17 »
Цитировать
Непонятен, я еще с трудом разбираю такие конструкции. :-(((

пока не попробуешь... потом в процессе эксплуатации ;) познаешь все плюсы.
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Названия массивов
« Ответ #10 : 09 Января 2002, 01:00:10 »
Цитировать
#Процедура обхода дерева с использованием рекурсии
sub out
{
my $dirs=shift;
foreach (@$dirs){
print $_->{dir};
out($_->{link}) if ($_->{link});
}
}

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


А как это использовать? Допустим, есть каталог относительно скрипта
../dir
Как вытащить из него все подпапки? (всех глубин, а не только последнего уровня)
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Боря Елкин

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://webmetr.pips.ru
Названия массивов
« Ответ #11 : 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")); #прочитаем каиталог, запишем в структуру и выведем

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28