Forum Webscript.Ru

Программирование => Perl => Тема начата: cr4ck3r от 23 Июня 2005, 12:14:13

Название: Динамическое имя переменной (хэша)
Отправлено: cr4ck3r от 23 Июня 2005, 12:14:13
Продолжаю заморачиваться тут с этой прогой. С функциями разобрался с помощью 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 и т.д в зависимости от типа данных).
Как мне в данном случае работать с хэшом?
Спасибо.
Название: Динамическое имя переменной (хэша)
Отправлено: cr4ck3r от 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/);
   }   
}
Название: Динамическое имя переменной (хэша)
Отправлено: Ivan Kolesnikov от 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 от 23 Июня 2005, 14:02:10
Ну вот пока я писал, ты и сам разобрался :)
Название: Динамическое имя переменной (хэша)
Отправлено: cr4ck3r от 23 Июня 2005, 14:27:31
Ivan Kolesnikov
все равно спасибо за пример.
Название: Динамическое имя переменной (хэша)
Отправлено: ondr от 23 Июня 2005, 14:36:19
Ivan Kolesnikov
почти всё верно, только $ref = \\%temp - это тоже символическая ссылка. ссылаться сим. ссылки могут также и по адресу памяти, важно, что при этом сим. ссылка являются "как бы" отдельной и самостоятельной переменной.
примеры жестких ссылок:

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

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

*b = *a; - и это
Название: Динамическое имя переменной (хэша)
Отправлено: AnnA от 24 Июня 2005, 11:39:36
Ivan Kolesnikov
здОрово!
и теорию расписали и примерчик тут же. :)
редко подобные ответы на форумах случаются. Большинство обычно, с высоты своих знаний, снисходительно тыкают в перлдок.
+1.
Название: Динамическое имя переменной (хэша)
Отправлено: ondr от 24 Июня 2005, 12:02:14
[OFF]AnnA многие осознают, что объяснить лучше чем расписано и разжевано в perldoc\'е не могут[/OFF]