1. Perl / Говнокод #2668

    −104.3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    # (S) (рекурсивного вызова) Генерирует контент слота рекурсивного дерева (с плюсиками). Возвращает ('RecursiveSlot'=>$textbuf) или ()
    sub PlusTreeSlot {
            # (P) Путь к шаблону контентной ячейки
            # (P) ghm
            # (P) pid
            # (P) treename
            # (P) Уровень
            # (P) функция
            # (P) $ret
    
            return () if !exists($_[1]->{$_[2]}); # Не вкладываем ничего в слот если там ничего нет
            my $textbuf;
            foreach (@{$_[1]->{$_[2]}}){
                    my $ret=&{$_[5]}($_,$_[4],ref($_[6])?dclone($_[6]):$_[6]) if $_[5];
                    $textbuf.=${tmpl_prepare($_[0],{
                                    PlusTreeSlot($_[0],$_[1],$_->{'id'},$_[3],($_[4]+1),$_[5],$ret),
                                    %{$_},
                                    'trname'=>$_[3],
                    })};
            };
            return ('RecursiveSlot'=>$textbuf);
    };

    А вам тоже нравятся безымянные параметры?
    А писать код без пробелов?
    Кроме того, эта функция, вызывая себя рекурсивно, каждый раз заново открывает, читает, парсит и закрывает один и тот же файл шаблона.

    Запостил: ichesnokov, 25 Февраля 2010

    Комментарии (4) RSS

    • Зато сэкономил память.
      А где файл открывается? В упор не вижу.
      Ответить
      • Подготовка шаблона (открытие и парсинг файла) происходит внутри функции tmpl_prepare(). Содержимое функции здесь не приводится, я решил вкратце словами её описать.

        Не вижу, если честно, где здесь память экономится. Какая разница - каждый раз выделять блок памяти при открытии и чтении файла, а потом уничтожать его - или же постоянно хранить данные в одном блоке памяти в течение вызова функции?
        Ответить
      • А вот это врядли. Perl скорее всего раму не отдаст системе в обоих случаях.
        Ответить
    • Жесткокод
      Ответить

    Добавить комментарий