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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивный поиск в хешах и масивах, Модуль, или как реализовать 
:(
    Опции темы
Logo
Дата 4.4.2012, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть ли модуль для рекурсивного поиска в хешах и массивах? То есть, допустим что бы сделать grep фильтр
Код

$data = {
   one => [
       'target'
   ],
   two => {
     foo => target
  },
  three => 'target',
  four => {foo => bar}
};

for (keys %$data) {
  dump $data->{$_} if Search($data->{$_}, qr/target/);
  #дамп one, two, three
}


Так же, хотелось бы, что бы умел находить путь к целевому элементу, например так:
Код

$data = {
  foo1 => {
    bar => { baz => 10 },
    foo2 => [
      { foo3 => 'target' },
      'baz',
    ],
    baz => [1, 2, 3],
  }
}

$path = Find($data, qr/target/);
dump $path;
#out:
#$VAR1 = {
#  foo1 => {
#    foo2 => [
#      { foo3 => 'target'}
#    ]
#  }
#}

#Либо так
print $path;
#out:
#$VAR1->{foo1}{foo2}[0]{foo3}

PM MAIL   Вверх
EcSYZ
Дата 4.4.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#!/usr/bin/perl
$|++;
use common::sense;
use Data::Dumper;


my $data = {
   'one' => [
       'target'
   ],
   'two' => {
     'foo' => 'target'
  },
  'three' => 'target',
  'four'  => {'foo' => 'bar'}
};

&search($data, 'target', 'root');

sub search
{
    my ($data, $template, $prefix) = @_;
    
    my $path = '';
    if(ref $data eq 'HASH'){
        foreach my $key(keys %$data){
            
            if(ref $data->{$key} eq 'HASH' || ref $data->{$key} eq 'ARRAY'){
                $path = search($data->{$key}, $template, $prefix.'->{'.$key.'}');
            } else {
                if($data->{$key} eq $template){
                    $path = $prefix.'->{'.$key.'}';
                }
            }
            if($path ne ''){ say "$path"; $path='';}
        }
    }
    if(ref $data eq 'ARRAY'){
        for(my $i=0; $i < scalar @$data; $i++){
            
            if(ref $data->[$i] eq 'HASH' || ref $data->[$i] eq 'ARRAY'){
                $path = search($data->[$i], $template, $prefix.'->['.$i.']');
            } else {
                if($data->[$i] eq $template){
                    $path   = $prefix.'->['.$i.']';
                }
            }
            if($path ne ''){ say "$path"; $path='';}
        }
    }
    return $path;
}



Код

[ecsyz@localhost trash_scripts]$ ./struct_search.pl 
root->{three}
root->{one}->[0]
root->{two}->{foo}

PM MAIL WWW   Вверх
Pfailed
Дата 4.4.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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





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


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

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


 




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


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

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