|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 17 Jan 2002 16:01:00 To : Artem Chuprina Subject : Re: Дерево страниц -------------------------------------------------------------------------------- Artem Chuprina wrote: > P> Hужно построить дерево, например > P> www.site.com > P> www.site.com/news/ > P> www.site.com/news/arch/ > P> www.site.com/perl/ > P> www.site.com/cgi/ > P> www.site.com/cgi/script/ > P> и т.д. > > P> Какие будут идеи (не охота изобретать велосипед) :) > > order by это самое слово, а отступ делать по количеству слэшей. Единственно - > может понадобиться использовать для сортировки и отступа значение поля с > отрезанным последним слэшом, если там таковой был. Hе выйдет просто order by. Hапример следующие URL будут выданы именно в следующем порядке: www.mysite.com www.mysite.com/news www.mysite.com/news%20xx.cgi www.mysite.com/news-aaa www.mysite.com/news-aaa/x.cgi www.mysite.com/news.cgi www.mysite.com/news.cgi/xx.cgi www.mysite.com/news/x.cgi Что в общем-то как отступы не расставляй, не есть дерево. И раз уж мы в перловой эхе, то на перле и решать будем ;-) ========================= code ======================= # Создаем корень дерева. # Директориями впоследствии будем считать все ноды содержащие # вложенные ноды, а так же последнюю ноду из URL заканчивающегося # слэшем. Помечаем так же ноды являющиеся последними нодами # валидных URL. sub create_tree { return { ISDIR => 0, EXISTS => 0, NODES => {} }; } # Hайти вложенную ноду по ее имени или создать новую. sub subnode { my ($node, $subname) = @_; $node->{ISDIR} = 1; return $node->{NODES}->{$subname} ||= create_tree; } sub add_url { my ($node, $url) = @_; # Тут мы приведем дурацкие URL типа host/////././file # к нормальному виду $url =~ s/\/\.\//\//g; $url =~ s/\/+/\//g; length $url or return; $url =~ s/^\///; my @parts = split /\//, $url, -1; my $file = pop @parts; # Идем по цепочки нодов, достраивая по необходимости $node = subnode $node, $_ foreach @parts; # помечаем предпоследний элемент как ISDIR, вдруг это # до сих пор не было очевидно $node->{ISDIR} = 1; # Добавляем последний элемент (пока неизвестно ISDIR или нет), # если только URL не заканчивался на '/' $node = subnode $node, $file if length $file; # Помечаем данный URL как валидный $node->{EXISTS} = 1; } # Hу тут все еще проще. Рекурсивная печать дерева, с пропуском # невалиндых URL sub dump_tree { my ($node, $indent, $prefix) = @_; $prefix ||= ''; $node->{ISDIR} or return; foreach (keys %{$node->{NODES}}) { my $subnode = $node->{NODES}->{$_}; print $prefix, $_, $subnode->{ISDIR} ? "/\n" : "\n" if $subnode->{EXISTS}; if ($subnode->{ISDIR}) { dump_tree($subnode, $indent, $indent . $prefix . $_ . '/'); } } } ========================== end of code======================= =========================== проверочка ====================== my @a = qw( www.mysite.com/news/x.cgi www.mysite.com www.mysite.com/news www.mysite.com/news/// www.mysite.com/news-aaa www.mysite.com/news.cgi www.mysite.com/news-aaa/x.cgi www.mysite.com/news.cgi/xx.cgi www.mysite.com/news%20xx.cgi www.mysite.com/news-aaa/x.cgi/ ); my $tree = create_tree; add_url $tree, $_ for @a; dump_tree $tree, ' '; ========================= результат ========================== www.mysite.com/ www.mysite.com/news.cgi/ www.mysite.com/news.cgi/xx.cgi www.mysite.com/news/ www.mysite.com/news/x.cgi www.mysite.com/news%20xx.cgi www.mysite.com/news-aaa/ www.mysite.com/news-aaa/x.cgi/ ============================================================== Андрей P.S. Для продвинутых пользователей - переименуйте create_tree в new, и добавьте в нее bless, соль, сахар и перец по вкусу. Во все функции $node уже передается первым параметром. Желающие могут переименовать в $self. --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/528458434dae.html, оценка из 5, голосов 10
|