The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Perl ключ HASHа это указательна на другой HASH возможно?, !*! Krylov, 16-Апр-07, 16:17  [смотреть все]
Задача в следующем:
Есть ХЕШ %id ключом в этом хешэ является ID пользователя, значением - указатель на другой ХЭШ который всвою очередь содержит описания для данного ID пользователя.

Хочется создать на базе ХЭШа %id новый ХЭШ %new где в качестве ключа хеша %new должно быть значение хэша %id (то есть указатель на хэш с описанием), а в качестве значения должно быть одно из свойст хеша описаний. Все отлично до момента когда я пытаюсь разыменновать ключ хеша %new (см. код со строчкой !!!!).
Вот и возникает вопрос можно ли использовать указатель на хэш в качестве ключа хеша с последующим разыменование этого ключа?

Код:

my @users = qw(d a c b); # Id пользователя
my @size = qw(10 5 20 4);
my @color = qw(red black white green);
my %id = ();
my %new = ();

# формирование ХЭШа %id. Ключ хэша %id - id пользователя,
# значение указатель на хэш %sub содержаший описание
my $i = 0;
foreach my $id (@users){
            # хешь с описанием
            my %sub = (size => "$size[$i]", color => "$color[$i]");
            $i++;
            $id{$id} = \%sub;
    }
# ввыод на экран ключей и значений хэша %id с ключами и значениями
# хэша %sub
foreach my $user_id (keys %id){
    my $ptr = $id{$user_id};
    print "[$user_id => $id{$user_id}]\n";
    foreach my $sb (keys %$ptr){
            print ("\t$sb => $$ptr{$sb}\n");
    }
}
# формирование нового хэша %new из хэша %id
# ключом в хэше %new является указатель на хэш %sub, а значением -
# значение ключа 'size' хеша %sub.

print "\nNew array\n";
foreach my $adr (keys %id){
    my $ptr_adr = $id{$adr};
    $new{$ptr_adr} = $$ptr_adr{'size'};
}
# вывод на экран ключа=>значения хэша %new
foreach my $key (keys %new){
   print "[$key => $new{$key}]\n";
  
   # !!!!!!!!!!!!!!!!!!!!!
   # почему я немогу разыменновать указатель, который являтся ключом хэша
   print "[[%$key]]\n";
}

ВВЫОД ДАННОГО КОДА НА ЭКРАН:
[c => HASH(0x18d65f4)]
    color => white
    size => 20
[a => HASH(0x18d65e8)]
    color => black
    size => 5
[b => HASH(0x18d6690)]
    color => green
    size => 4
[d => HASH(0x18ea2e8)]
    color => red
    size => 10

New array
[HASH(0x18d6690) => 4]
[[%HASH(0x18d6690)]]         !!! тут должно быть green, 4
[HASH(0x18ea2e8) => 10]
[[%HASH(0x18ea2e8)]]         !!! итп
[HASH(0x18d65e8) => 5]
[[%HASH(0x18d65e8)]]         !!! итп
[HASH(0x18d65f4) => 20]
[[%HASH(0x18d65f4)]]         !!! итп

  • Perl ключ HASHа это указательна на другой HASH возможно?, !*! A, 17:19 , 16-Апр-07 (1)
    нет. указатель нельзя использовать как ключь.
    вернее можно, но при этом указатель превращается в строку и перестаёт быть указателем.
    погу посоветовать сложить хэши-ключи в массив или в хэш и использвать индексы этого массива (или ключи этого хэша), как ключи.
    • Perl ключ HASHа это указательна на другой HASH возможно?, !*! Krylov, 18:37 , 16-Апр-07 (2)
      >нет. указатель нельзя использовать как ключь.
      >вернее можно, но при этом указатель превращается в строку и перестаёт быть
      >указателем.
      >погу посоветовать сложить хэши-ключи в массив или в хэш и использвать индексы
      >этого массива (или ключи этого хэша), как ключи.

      Большое спасибо за ответ.

      Если не сложно может вы подскажите как  правильней отсортировать хэш %user по значению ключа 'size' хеша %sub и при этом не потерять связь между хэшаем с описаниями пользователей (%sub) с хэшом %id?

      то есть для моего примера после сортировки должно получиться следующие
      user C size 20 (\%sub для узера C)
      user D size 10 (\%sub для узера D)
      user A size 5 (\%sub для узера A)
      user B size 4 (\%sub для узера B)

      • Perl ключ HASHа это указательна на другой HASH возможно?, !*! A, 09:07 , 17-Апр-07 (3)
        >>нет. указатель нельзя использовать как ключь.
        >>вернее можно, но при этом указатель превращается в строку и перестаёт быть
        >>указателем.
        >>погу посоветовать сложить хэши-ключи в массив или в хэш и использвать индексы
        >>этого массива (или ключи этого хэша), как ключи.
        >
        >Большое спасибо за ответ.
        >
        >Если не сложно может вы подскажите как  правильней отсортировать хэш %user
        >по значению ключа 'size' хеша %sub и при этом не потерять
        >связь между хэшаем с описаниями пользователей (%sub) с хэшом %id?
        >
        >то есть для моего примера после сортировки должно получиться следующие
        >user C size 20 (\%sub для узера C)
        >user D size 10 (\%sub для узера D)
        >user A size 5 (\%sub для узера A)
        >user B size 4 (\%sub для узера B)

        Честно пытался въехать что вам нужно минут десять, так и не смог :-) уж извиняйте :-)

        • Perl ключ HASHа это указательна на другой HASH возможно?, !*! Krylov, 12:07 , 17-Апр-07 (4)
          >>Честно пытался въехать что вам нужно минут десять, так и не смог
          >:-) уж извиняйте :-)
          Извеняюсь за то, что отнял у вас 10 минут своим плохим описанием вопроса. Но попытаюсь обяснить еще раз может на этот раз получиться :) если не сложно
          Значит есть код:
          -----------------------------------------------
          my @users = qw(d a c b); # Id пользователя
          my @size = qw(10 5 20 4);
          my @color = qw(red black white green);
          my %id = ();

          my $i = 0;
          foreach my $id (@users){
                      # хешь с описанием
                      my %sub = (size => "$size[$i]", color => "$color[$i]");
                      $i++;
                      $id{$id} = \%sub;
              }
          -----------------------------------------------------
          Этот код формирует хэш %id, в котором в качестве ключа используется id пользователя (см. @users содержащий id), а в качестве значения - указатель на хэш \%sub. Хэш %sub содержит для каждого пользователя его описание (color, size). Мне нужно отсортировать хэш %id по значению size хэша %sub. Другимим словами нужно получить отсортированый хэш %id, но сортировку производит по значению ключа size хэша %sub.

          • Perl ключ HASHа это указательна на другой HASH возможно?, !*! A, 17:18 , 17-Апр-07 (5)
            ну я не очень понял что такое сортированый хэш... но идею вроде уловил :-)
            вот массив хэшей sub сортированых по sort:

            my @sort = sort {$a->{'size'} <=> $b->{'size'}} values %id;

            если нужно сохранить и id, то их можно добавить в sub-ы:

            my %id2 = map {$_ => {%{$id{$_}}, 'id' => $_}} keys %id;

            • Perl ключ HASHа это указательна на другой HASH возможно?, !*! Krylov, 18:19 , 25-Апр-07 (6)
              Извеняюсь, что так долго не мог отписать Вам ответ
              >ну я не очень понял что такое сортированый хэш... но идею вроде
              >уловил :-)
              >вот массив хэшей sub сортированых по sort:
              >
              >my @sort = sort {$a->{'size'} <=> $b->{'size'}} values %id;

              Данный код то, что я хотел БОЛЬШОЕ СПАСИБО


              >my %id2 = map {$_ => {%{$id{$_}}, 'id' => $_}} keys %id;
              А вот в данном коде я не смог разобраться. Если вам не сложно поясните ваше выражение
              $_ => {%{$id{$_}}, 'id' => $_}


              • Perl ключ HASHа это указательна на другой HASH возможно?, !*! A, 09:12 , 26-Апр-07 (7)
                >Извеняюсь, что так долго не мог отписать Вам ответ
                >>ну я не очень понял что такое сортированый хэш... но идею вроде
                >>уловил :-)
                >>вот массив хэшей sub сортированых по sort:
                >>
                >>my @sort = sort {$a->{'size'} <=> $b->{'size'}} values %id;
                >
                >Данный код то, что я хотел БОЛЬШОЕ СПАСИБО
                >
                >
                >>my %id2 = map {$_ => {%{$id{$_}}, 'id' => $_}} keys %id;
                >А вот в данном коде я не смог разобраться. Если вам не
                >сложно поясните ваше выражение
                >$_ => {%{$id{$_}}, 'id' => $_}

                как это это пояснить... :-)
                <$_> => <{%{$id{$_}}, 'id' => $_}>
                <прежний ключь> => <некий хэш>
                что в хэше?
                {<%{$id{$_}}>, <'id' => $_>}
                это
                {<весь прежний хзш>, <+новая пара 'id' => ключь>}

                то есть у вас есть супер-хэш в котором хранятся хэши, я в каждый хэш добавил пару 'id' => "ключь супер-хэша".

                это можно сделать вот для чего: при сортировке ключи супер-хэша пропадают (супер-хэш превращается в массив), если вам надо сохранить о них информацию, то имеет смысл преобразовать все хэши супер-хэша, добавив в них новую пару.

                если ключь супер-хэша вам не нужен, то и забейте :-)

                • Perl ключ HASHа это указательна на другой HASH возможно?, !*! Krylov, 10:09 , 27-Апр-07 (8)
                  >как это это пояснить... :-)
                  ><$_> => <{%{$id{$_}}, 'id' => $_}>
                  ><прежний ключь> => <некий хэш>
                  >что в хэше?
                  >{<%{$id{$_}}>, <'id' => $_>}
                  >это
                  >{<весь прежний хзш>, <+новая пара 'id' => ключь>}
                  >
                  >то есть у вас есть супер-хэш в котором хранятся хэши, я в каждый хэш добавил пару 'id' => "ключь супер-хэша".

                  Теперь все понятно большое Вам СПАСИБО!

                  >
                  >это можно сделать вот для чего: при сортировке ключи супер-хэша пропадают (супер-хэш
                  >превращается в массив), если вам надо сохранить о них информацию, то
                  >имеет смысл преобразовать все хэши супер-хэша, добавив в них новую пару.
                  >
                  >
                  >если ключь супер-хэша вам не нужен, то и забейте :-)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру