Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> линейный обход хэша 
:(
    Опции темы
mastercz
Дата 16.9.2010, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Добрый день!
Прочитав статью http://base.vingrad.ru/view/1942-Rekursivn...a-ih-lineynyimi я задался вопросом а возможен ли subj.
Т. е. Возможно ли реализовать функцию обхода сложного хэш-массива без рекурсии?
PM MAIL   Вверх
Jimy
Дата 16.9.2010, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Можно.
Рекурсию не сложно заменить использованием стэка.
PM   Вверх
ming
Дата 16.9.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: 2
Всего: 3



Я у себя использую такой велосипед smile 
Код
sub traverse {
    my ($parent, $onEachSub) = @_;
    
    my (@stack, @parents, @keys);
    push @parents,    $parent;
    push @keys,        keys %$parent;

    my $level = 0;
    
    while(1) {
        my $current_key = shift @keys;
        $parent = $parents[-1];
        if (!$current_key) {
            my $arr_ref = pop @stack;
            if(!$arr_ref) { # stack is empty
                last;
            }
            @keys = @$arr_ref;
            $level--; 
            $parent = pop @parents;
            next;
        } 
        my $current = $parent->{$current_key};
        
        # call handler
        &$onEachSub($current_key,$current,$level) if defined $onEachSub;

        my @subnode_keys = $current ? keys %$current : ();
        if (@subnode_keys) {
            push @stack, [ @keys ];
            push @parents, $current;
            $parent = $current;
            $level++;
            @keys = @subnode_keys;
            next;
        }
    }
}


Хэш допустим такой :
Код
my $HASH= {
            'a' => 
                {
                    'a0' => {
                                'a0_1' => {
                                          'x'=>undef,
                                          'y'=>undef
                                            },
                            },
                    'a1' => undef,
                    'a2' => {
                                'a2_1' => undef,
                            },
                },
            'b' => 
                {
                    'b1' => undef,
                    'b2' => {
                            'b2_1' => {
                                       'M'=>undef,
                                       'N'=>undef
                                        }
                            },
                    'b3' => {
                            'b3_1' => undef
                            },
                }

};


Вызываю так
Код
traverse($HASH, 
    sub {
        # $current_key - ключ текущего элемента, 
        # $current - сам текущий элемент (анонимный субхэш), 
        # $level - уровень вложенности текущего элемента ("0" = верхний уровень)
        my ($current_key, $current, $level) = @_;
        print "     "x$level, "$current_key\n";    
    });


результат 
user posted image



Это сообщение отредактировал(а) ming - 16.9.2010, 11:33
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.