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


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)
 
 

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

 Тема:    Автор:    Дата:  
 Дерево страниц   PROext   17 Jan 2002 11:31:35 
 Re: Дерево страниц   Artem Chuprina   17 Jan 2002 12:22:58 
 Re: Дерево страниц   PROext   17 Jan 2002 14:07:57 
 Re: Дерево страниц   Ivan Frolcov   17 Jan 2002 14:51:02 
 Re: Дерево страниц   PROext   17 Jan 2002 15:48:35 
 Re: Дерево страниц   Ivan Frolcov   17 Jan 2002 16:13:50 
 Re: Дерево страниц   Artem Chuprina   17 Jan 2002 15:17:50 
 Re: Дерево страниц   PROext   17 Jan 2002 15:48:35 
 Re: Дерево страниц   Artem Chuprina   17 Jan 2002 16:44:03 
 Дерево страниц   Denis Poznyakov   17 Jan 2002 15:01:14 
 Дерево страниц   Denis Poznyakov   17 Jan 2002 15:09:30 
 Re: Дерево страниц   Andrey Sapozhnikov   17 Jan 2002 16:01:00 
 Re: Дерево страниц - спасибо   PROext   17 Jan 2002 17:31:19 
Архивное /ru.perl/528458434dae.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional