Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : vilfred                              2:5020/400     14 Feb 2002  17:50:17
 To : Artem Chuprina
 Subject : Re: дерево каталогов на вложенных хешах... как?
 -------------------------------------------------------------------------------- 
 
 
 Привет!
 
 AC> Hет. Значение _данного_ элемента хэша - массив.
 AC> Вернее, ссылка на массив, то
 AC> есть на тот же самый массив может ссылаться и еще
 AC> что-нибудь. Hа остальные
 AC> элементы хэша это никаких ограничений не
 AC> накладывает. Что из примера, в общем,
 AC> тоже видно.
 
 ну это не суть так важно... меня не это волнует вобщем-то, идея сама.
 AC> eval чего и на что матерится? Что на входе, я
 AC> вроде понял - путь к директории.
 AC> А что на выходе должно быть? И чем File::Find не
 AC> устраивает?
 
 ну, как сказать, eval матерится потому что я плохой прогер, но мысль то 
 другая, eval просто рекурсивно будет увеличивать число циклов foreach в 
 тексте скрипта и соответствующее этим фореачам число циклов, 
 вытаскивающих информацию из хеша. 
 
 программа которая делает хеш хешей хешей хешей массивов
 
 #!/usr/bin/perl
 
 foreach $lett(qw(meat beer)){
   foreach $num(qw(war peace)){
     foreach $tes(qw(one two)){
       foreach $users(qw(bred pitt)){
   @{$hhh{$lett}{$num}{$tes}{$users}}=qw(beer vodka);
       }
     }
   }
 }
 print "hash\tsubhash\t subsubhash\tmassives\n";
 for $let(sort keys %hhh) {
   print "hash $let: (\n";
   for $nums (sort keys %{$hhh{$let}}) {
     print "\tsubhash $nums (\n\t";
     for $ltr(sort keys %{$hhh{$let}{$nums}}){
       print "\tsubsubhash $ltr (\n\t";
       for $aa(sort keys %{$hhh{$let}{$nums}{$ltr}}){
   print "\t\t'$aa'  => [ ";
   print join " | " => @{$hhh{$let}{$nums}{$ltr}{$aa}};
   print " ]\n\t";
       }
       print ")\n\t";
     }
     print "    \t)\n";
   }
   print ")\n";
 }
 
 ** Joe's Own Editor v2.8l ** Copyright (C) 1995 Joseph H. Allen **
 File hhhsh.pl not changed so no update needed.
 bash-2.05$ ./hhhsh.pl | less
 hash  subhash   subsubhash massives
 hash beer: (
   subhash peace (
    subsubhash one (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    subsubhash two (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    )
   subhash war (
    subsubhash one (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    subsubhash two (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    )
 )
 hash meat: (
   subhash peace (
    subsubhash one (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    subsubhash two (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    )
   subhash war (
    subsubhash one (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    subsubhash two (
       'bred'  => [ beer | vodka ]
       'pitt'  => [ beer | vodka ]
   )
    )
 )
 bash-2.05$
 
 Хеши можно строить(я пытался просто раздувать размер скрипта eval'ом, 
 но это как-то по идиотски) любой степени вложенности просто прибавляя 
 лишний цикл и лишнюю пару фигурных скобок в $hhh{$lett}{$num}{$tes}
 {$users}, т.е. $hhh{$lett}{$num}{$tes}{$users}{$dream} уже будет хешем 
 хешей хешей хешей хешей т.д. 
 
 А в конце, используя оператор @{а тут хеш хешей хешей хешей хешей ... 
 n+1 ...}=qw(blah blah blah) можно приспособить хешn массивов. Итого это 
 будет выглядеть так: 
 
 @{$hhh{$lett}{$num}{$tes}{$users}}=qw(beer vodka); 
 
 но мне не нравится тчо там стоит 4 фореача, т.е. я при помощи eval 
 просто напросто увеличиваю число строк содержащих foreach. А без 
 foreach нельзя построить дополнительный хеш, т.е. в любом случае это 
 раздувание скрипта. Ведь 
 $hash{}->{}->{}->{}->{}->{}->{}->{}->{}->{} ... и т.д. нельзя ли
 это как-то по другому сделать, не через eval А допустим глубину 
 вложенности, типа подуровней(число этажей вложденных поддиректорий) 
 ставить первым элементом массива. Блин, У меня просто хеш хешей, а 
 последний элементик это просто массив из файлов в данной директории. И 
 первым в этом массиве, нулевым элементом стоит цифра 10, т.е. есть 10 
 этажей(поддиректорий) подхешей. Т.е. проге эта цифра говорит о том, что 
 нужно еще 10 раз соорудить конструкцию.
 
 File::Find у меня выдает листинг директорий сервера в несколько 
 мегабайт просто, там 20 гигов лежит всякого.
 
 пытался сделать так:
 
 #!/usr/bin/perl
 
 my $di="/var/www/html/";
 #my $m="{perl}";
 &scan($di);
 
 sub  scan {
   my $dir=$_[0]; my $h1=$_[1];
   my (@files,$filen,$ndir,$n,$mass,@dirs);
   opendir D, $dir or warn "Cannot open $dir: $!" and next;
   @dirs=grep {!(/^\./) && -d "$dir/$_"} readdir D;
   rewinddir D; closedir D;
   for $n(0..$#dirs) {
     $h="$h1\{$dirs[$n]}";
     $ndir="$dir/$dirs[$n]";
     #print "\$hash$m$h1\{$dirs[$n]}\n";
     my $u="\$hhh$m$h1\{$dirs[$n]}";
     print $u,"\n";
     eval{"$u"};#тут то оно и должно создавать вложенный подхеш
     #вместо того, чтобы писать каждый раз вручную foreach
     #как это было в первом примере...
     &scan($ndir, $h);
   }
   return 1;
 }
 
 на выходе скрипт дает
 
 [root@www genphys]# ./sdir.pl
 
 $hhh{manual}
 $hhh{manual}{images}
 $hhh{manual}{misc}
 $hhh{manual}{mod}
 $hhh{manual}{mod}{mod_perl}
 $hhh{manual}{search}
 $hhh{manual}{vhosts}
 $hhh{about}
 $hhh{about}{_vti_cnf}
 $hhh{base}
 $hhh{base}{Include}
 $hhh{base}{_vti_cnf}
 $hhh{web}
 ... и т.д.
 
 дальше условием, просто недоделал, if exists просто пищется информация 
 в хеш... но чего-то тут не выходит. Пытался присобачить массив к хешу - 
 не выходит. Hу это ладно, разберусь, но не хочется именно eval генерить 
 строчки скрипта, чтобы туда всунуть эти самые подхеши и т.д. Красивая 
 ведь штука. Потом схожу в ru.unix, спрошу как сделать дамп в памяти что 
 скрипт наделал в этом хеше. Далее читать эту всю шнягу за раз и вообще 
 можно подумать о другом устройстве файловой системы. Т.е. элемент 
 массива содержит тело самого файла, еще всякие перекрестные ссылки, ну, 
 принцип хеширования в поиске, как risearch сделан. В обычной файловой 
 системе чтобы дописать в начало файла строчку нужно передвинуть весь 
 файл вниз просто напросто. А тут, насколько я понял, просто дописать 
 нужный элемент. Hо это еще думать нужно, потому что файловая система на 
 файловой системе, короче оно все в любом случае будет пользоваться 
 старой системой перезаписи. Hу вобщем вот для чего это все 
 хеширование... такая вот мысля. И все базы данных тогда просто 
 посылаются очень быстро...
 
 AC> Пока это аналог find. Аналогом slocate это
 AC> станет, если ты это засунешь в базу
 AC> с достаточно быстрым доступом на чтение. Причем
 AC> даже не на доступ по индексу,
 AC> а на grep. Для чего та структура, которую ты
 AC> пытаешься получить, непригодна.
 
 я пытаюсть совершенно другую структуру получить, вообще другую в 
 принципе. Типа сидишь в joe редактируешь файл, все как обычно, 
 директории и пр. Hо на самом деле просто напросто правишь кусок 
 двоичного файла, и seek'ом перемещаешься по файлу, куда быстрее, типа 
 вводишь joe aaa.html, если этих aaa.html много, система предложит 
 выбрать нужный из любой директории или как-то еще сделать(потому как 
 aaa.html может быть слишком много, ну не знаю, флажок ставить и 
 отключать, как нибудь так). Вобщем тут недодумано, но эта идея заводит. 
 Потому как очень быстрый доступ к информации, супербыстрый. Могет даже 
 с Гуглей и яндехом посморить получится, потому как маскирующий поиск. 
 Hу вобщем это сложно все. не XML, но просто сложно объяснить всю 
 картинку, что в голове сидит.
 
 короче про эту шнягу написал даже чего придумалось, чтобы просто не 
 забыть и заново не выдумывать. Если хочешь, кину ссылку. 
 
 но это все ерунда, но как эвал обойти-то, вот в чем вопрос-то, чтобы не 
 было его, не потому что у меня не получилось его запустить, а потому, 
 что это как-то некрасиво смотрится. Хотя попробую еще раз сделать, 
 может со второго раза выйдет.
 
 Дима
 
 p.s. я конешно понимаю, што меня тут-же оборут, но голову поломать над 
 этим интересно. Особенно над одной фенькой.
 
 -- 
 TEAM [Маньяки]
 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 --- ifmail v.2.15dev5
  * Origin: Talk.ru (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 дерево каталогов на вложенных хешах... как?   vilfred   14 Feb 2002 11:03:32 
 Re: дерево каталогов на вложенных хешах... как?   Artem Chuprina   14 Feb 2002 14:23:32 
 Re: дерево каталогов на вложенных хешах... как?   vilfred   14 Feb 2002 16:44:05 
 Re: дерево каталогов на вложенных хешах... как?   Artem Chuprina   14 Feb 2002 17:04:46 
 Re: дерево каталогов на вложенных хешах... как?   vilfred   14 Feb 2002 17:50:17 
 Re: дерево каталогов на вложенных хешах... как?   Artem Chuprina   15 Feb 2002 18:30:15 
Архивное /ru.perl/648887b206b0.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional