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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Путь к элементу структуры данных 
:(
    Опции темы
bonger
Дата 27.4.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую всех, вопрос следующий.
Допустим есть сложная структура данных. Типа массив ссылок на хеши в которых ссылки на массивы в которых ссылки на другие массивы, хеши, скаляры и.т.п.
И есть ссылка на один из элементов.
Могу ли я по ней получить путь к этому элементу в общей структуре.
Для примера:
@arr = [{key0 => [{key1 => [["tryToFind"],[15]]},{key2=>[20]}]}] - адская структура.
Мы разбирали структуру и сохранили ссылку на что то. Нарпимер $link.
ref($link); #SCALAR
print $$link; #15
Нам нужно по этим данным получить полный путь к элементу в структуре, типа такого:
@arr[0]->[0]{key0}[0]->{key1}[1][0]; #путь к тем же "15".
Нет ли каких модулей, позволяющих это сделать легко и непринужденно?

Это сообщение отредактировал(а) bonger - 27.4.2011, 13:33
PM MAIL   Вверх
arto
Дата 27.4.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



perldoc Data::Traverse

только как вы одни 15 будете отличать от других?
PM MAIL ICQ   Вверх
bonger
Дата 27.4.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так.. как бы образно говоря ссылка - ссылается на область памяти. А когда мы получаем доступ к элементу любым другим способом - мы точно так же обращаемся к этой же области памяти. Как можно их спутать?
По поводу Traverse сейчас посмотримс, спасибо.

Tracerse не совсем то... Хотелось бы типа(в продолжение предыдущего кода):

print magic_data_finder(@arr, $link); # вывел бы нам @arr[0]->[0]{key0}[0]->{key1}[1][0]

Это сообщение отредактировал(а) bonger - 27.4.2011, 14:22
PM MAIL   Вверх
mishnik
Дата 29.4.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bonger @  27.4.2011,  13:24 Найти цитируемый пост)
@arr = [{key0 => [{key1 => [["tryToFind"],[15]]},{key2=>[20]}]}] - адская структура.

очень плохой код, для данных сущетсвют базы данных!!!
что за задача то?
PM MAIL   Вверх
Pfailed
Дата 27.5.2011, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Просто написать рекурсивную функцию
Код

use strict;
use Data::Dumper;

my $link = [15];
my $arr = [{key0 => [{key1 => [["tryToFind"],$link]},{key2=>[20]}]}];

if (my $found = find($arr, $link, '$arr')) {
    print $found, ":\n", Dumper(eval "$found");
}
else {
    print "Not found\n";
}

sub find($$$) {
    my ($arg, $link, $res) = @_;
    my $ref = ref $arg;
    
    if ($link == $arg) {
        return $res;
    }
    elsif ($ref eq 'ARRAY') {
        for (my $i=0; $i<@$arg; $i++) {
            if (my $rv = find($arg->[$i], $link, $res."->[$i]")) {
                return $rv;
            }
        }
    }
    elsif ($ref eq 'HASH') {
        while (my ($k, $v) = each %$arg) {
            if (my $rv = find($v, $link, $res."->{$k}")) {
                return $rv;
            }
        }
    }
    elsif ($ref) {
        die 'Not supported reference type: ', $ref;
    }
    
    return undef;
}


Цитата

$arr->[0]->{key0}->[0]->{key1}->[1]:
$VAR1 = [
          15
        ];




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


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

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


 




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


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

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