|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/648887b206b0.html, оценка из 5, голосов 10
|