| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Динамическое изменение кода во время работы |
| Автор: loginn 28.8.2011, 21:26 |
| Есть динамический массив. Каждый элемент массива содержит имя ключа следующего по иерархии хэша. Нужно перебрать этот массив, и на каждой итерации проверить, существует ли такой ключ... Если проверять только первый уровень иерархии, то все легко и просто. Но если появляются второй и и т.д. то не понятно, как на первой итерации обращаться к ключу первой иерархии, на второй - к ключу второй иерархии и т.д. %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, а сам аргумент. Вот голову ломаю, как воплотить это в жизнь... Заранее спасибо всем, кто поделится дельными советами! |
| Автор: DurRandir 29.8.2011, 00:56 | ||
Сделать рекурсивную функцию, в которую передавать аргументами имя ключа и ссылку на текущей уровень, т.е.
|
| Автор: loginn 29.8.2011, 09:06 | ||
Я хотел примерно что-то типо этого:
Вот только можно ли без использования eval сделать что-то подобное? |
| Автор: arto 29.8.2011, 16:11 |
| # 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 # |
| Автор: loginn 30.8.2011, 12:27 | ||
ок. всем спасибо. разобрался. |