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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое изменение кода во время работы 
:(
    Опции темы
loginn
Дата 28.8.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть динамический массив. Каждый элемент массива содержит имя ключа следующего по иерархии хэша.

Нужно перебрать этот массив, и на каждой итерации проверить, существует ли такой ключ...

Если проверять только первый уровень иерархии, то все легко и просто. Но если появляются второй и и т.д. то не понятно, как на первой итерации обращаться к ключу первой иерархии, на второй - к ключу второй иерархии и т.д.

%hash{level1_key}{level2_key}{level3_key}...{levelN_key}
т.е. мне непонятно, как сделать так, чтобы в зависимости номера итерации обращаться к ключу соответствующей глубины.

итерация 0: 
  if $hash{$array[0]} {
      
  }

итерация 1:
  if ($hash{$array[0]}{$array[1]}) {
      
  }

итерация 2:
  if ($hash{$array[0]}{$array[1]}{$array[2]}) {
      
  }

и т.д.

итерация 2:
  if ($hash{$array[0]}{$array[1]}{$array[2]}...{$array[N]}){
      
  }

т.е. на каждой итерации изменяется не значение аргумента оператора if, а сам аргумент.

Вот голову ломаю, как воплотить это в жизнь...

Заранее спасибо всем, кто поделится дельными советами!
PM MAIL   Вверх
DurRandir
Дата 29.8.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделать рекурсивную функцию, в которую передавать аргументами имя ключа и ссылку на текущей уровень, т.е.

Код

sub f{
  my ($hash, $key) = @_;

  if ($hash{$key}){
     ..
     f($hash{$key}, $key2};
  }
}


Это сообщение отредактировал(а) DurRandir - 29.8.2011, 00:57
PM   Вверх
loginn
Дата 29.8.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я хотел примерно что-то типо этого:

Код

#!/usr/bin/perl

$hash{key1} = {};
$hash{key1}{key2} = 'YES';
$hash{key1}{key3} = 'NO';
$hash{key1}{key4} = {};
$hash{key1}{key4}{key5} = 'Hui Znaet';

@k = ('key1','key2');
@k2 = ('key1','key3');
@k3 = ('key1','key4','key5');

$r = &dinamic (\@k);
$r2 = &dinamic (\@k2);
$r3 = &dinamic (\@k3);

print $r, "\n", $r2, "\n", $r3, "\n";

sub dinamic {
  my ($ref, $exp, $code, $rezult);
  $ref = shift;
  foreach (@{$ref}) {
    $exp  .= '{'."$_".'}';
  }
  $code .= "if (\$hash$exp) {return \$hash$exp}\n";
  if ($rezult = eval "$code") {return $rezult;}
}


Вот только можно ли без использования eval сделать что-то подобное?
PM MAIL   Вверх
arto
Дата 29.8.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



# perl -le '$a->{aa}->{bb}->{cc}->{dd} = 1; sub AA { my ( $hash, @ary ) = @_; return 1 unless (@ary); return exists $hash->{$ary[0]} ? AA($hash->{shift @ary}, @ary) : 0 } print AA($a, qw(aa bb cc))'   
1
# 
PM MAIL ICQ   Вверх
loginn
Дата 30.8.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

...
if ($r = &exst(\%commands, @command)) {&$r(\@arguments)};
...
sub exst {  
  my ($ref, @arg) = @_;
  $key = shift @arg;
  if (${$ref}{$key}) { 
    if (@arg) { exst (${$ref}{$key}, @arg); }
    else { return ${$ref}{$key}; }
  }
}
...


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


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

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


 




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


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

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