Автор Тема: Динамическое имя переменной (хэша)  (Прочитано 4294 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Продолжаю заморачиваться тут с этой прогой. С функциями разобрался с помощью ondr, а вот с хэшами что-то никак.

У меня есть функция которая андефит значения ключей, типа так:

sub flushGlobalHashes {
#my $type=uc(shift);
for (keys %DATA::RUTS) {
$DATA::RUTS{$_}=undef unless (/rn|rutid|cn|channel/);
}
}

Но вот хэши могут быть 4 видов (а точнее 4 хэша разных):
%DATA::RAL, %DATA::OFT, %DATA::RUTS, %DATA::CIRC, не хотелось бы писать для каждого из них процедуру, тем более что в приведенной выше порцедуре переменная $type (закоментирована) содержит предикат хэша (OFT,RAL,RUTS и т.д в зависимости от типа данных).
Как мне в данном случае работать с хэшом?
Спасибо.
Ворота в perl - perlmonks.org.ru

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Динамическое имя переменной (хэша)
« Ответ #1 : 23 Июня 2005, 13:51:02 »
Спасибо за внимание - сам разобрался.
Сделал так:

sub flushGlobalHashes {
my $type=uc(shift);
my $hash="DATA::$type";
for (keys %{$hash}) {
   $hash->{$_}=undef unless (/rn|rutid|cn|channel/);
   }   
}
Ворота в perl - perlmonks.org.ru

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Динамическое имя переменной (хэша)
« Ответ #2 : 23 Июня 2005, 14:00:44 »
Привет cr4ck3r  тебе необходимо использовать ссылки. Они бывают 2-х типов: жесткие (ссылаются именно на переменную) и символические (ссылаются по имени). Именно 2-ой тип и необходим тебе. Работа с разными типами ссылок не различается. Например у тебя есть ссылка $ref на хеш %temp, тогда чтобы получить сам хеш нужно написать %$ref, а чтобы обратится к элементу хеша $ref->{\'aaa\'}.
Отличие этих типов в инициализации:
$ref = \\%temp - жесткая
$ref = \'temp\' - символическая
Вот твоя процедура:

sub flushGlobalHashes {
my $type=uc(shift);
for (keys %$type) {
$type->{$_}=undef unless (/rn|rutid|cn|channel/);
}
}

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Динамическое имя переменной (хэша)
« Ответ #3 : 23 Июня 2005, 14:02:10 »
Ну вот пока я писал, ты и сам разобрался :)

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Динамическое имя переменной (хэша)
« Ответ #4 : 23 Июня 2005, 14:27:31 »
Ivan Kolesnikov
все равно спасибо за пример.
Ворота в perl - perlmonks.org.ru

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Динамическое имя переменной (хэша)
« Ответ #5 : 23 Июня 2005, 14:36:19 »
Ivan Kolesnikov
почти всё верно, только $ref = \\%temp - это тоже символическая ссылка. ссылаться сим. ссылки могут также и по адресу памяти, важно, что при этом сим. ссылка являются "как бы" отдельной и самостоятельной переменной.
примеры жестких ссылок:

foreach( $a ) {
  $_ - жесткая ссылка
}

func( $a );
sub func {
  $_[0] - тоже
}

*b = *a; - и это
0 OK, 0:1

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Динамическое имя переменной (хэша)
« Ответ #6 : 24 Июня 2005, 11:39:36 »
Ivan Kolesnikov
здОрово!
и теорию расписали и примерчик тут же. :)
редко подобные ответы на форумах случаются. Большинство обычно, с высоты своих знаний, снисходительно тыкают в перлдок.
+1.
пока-пока. :)

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Динамическое имя переменной (хэша)
« Ответ #7 : 24 Июня 2005, 12:02:14 »
[OFF]AnnA многие осознают, что объяснить лучше чем расписано и разжевано в perldoc\'е не могут[/OFF]
0 OK, 0:1

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28