Есть функция http://paste.org.ru/?vh7dt3, на основе чтения файлов/директорий состовляет сложный хэш.
На выходе ожидаю примерно такой хэш:
{
core=>{cmd=>cmd,ccd=>core-cmd},
channels=>#tezt,
locale=>utf8,
debug=>1,
user=>{},
server=>{}
}
Вместо этого получаю:
{
core=>{},
cmd=>cmd,
ccd=>core-cmd,
channels=>#tezt,
locale=>utf8,
debug=>1,
user=>{},
server=>{}
}Подскажите, что я не так делаю? почему ключи продолжают создаваться в "корне" хэша, хотя при вызове функции я передаю ссылки на дочерние хэши...видимо я чего-то не понимаю.
>Есть функция http://paste.org.ru/?vh7dt3, на основе чтения файлов/директорий состовляет сложный хэш.>Подскажите, что я не так делаю? почему ключи продолжают создаваться в "корне"
>хэша, хотя при вызове функции я передаю ссылки на дочерние хэши...видимо
>я чего-то не понимаю.А где там у тебя "дочерние хеши"?
нету их там! ты используешь один хеш в который все и добавляется! создай сначала дочерний хеш и для каждой ветви передавай его, и потом уже его и добавляй в свой сложный хеш.
>А где там у тебя "дочерние хеши"?
$C{$_}={} and cfg_readbranch("$cbranch/$_", \$C{$_})
Создаю и передаю... или не так нужно?
Хэш ведь создается, вот только элементы не в него добовляются, а в родительский, видимо как-то не так ссылку передаю на него
>>А где там у тебя "дочерние хеши"?
>$C{$_}={} and cfg_readbranch("$cbranch/$_", \$C{$_})
а ну да. я вначале не понял этой конструкции.>Создаю и передаю... или не так нужно?
думаю что не так предаешь(раз не работает)и знаешь чего, мне так кажеться что с приоритетами тут не все в порядке, возьмика все это в скобочки, а то мне кажеться что цикл выполняется только для cfg_readbranch("$cbranch/$_", \$C{$_})
а $C{$_}={} выполняется только один раз.
>и знаешь чего, мне так кажеться что с приоритетами тут не все
>в порядке
Не, с приоритетами всё впорядке, хэши создаются как надо...
Скорее всего ссылку как-то не так передаю, вопрос в том, как?:)
>>и знаешь чего, мне так кажеться что с приоритетами тут не все
>>в порядке
>Не, с приоритетами всё впорядке, хэши создаются как надо...
>Скорее всего ссылку как-то не так передаю, вопрос в том, как?:)ответ очень простой возми за правило ставить
#!/usr/bin/perl -wuse strict;
хотябы на этапе разработки программы!!!
ну а так вот:
#!/usr/bin/perl -wuse strict;
use Data::Dumper;#change this for deep search
my @rdeep=(4,0);
#my @rdeep=(2,0);
my $debugit=1;sub cfg_readbranch
{$rdeep[0] == $rdeep[1]?do{print"max recdeep: $rdeep[0], stop execute\n";return}:$rdeep[1]++ if $debugit;
my ($cbranch, $C) = @_;
my (@branches, @keys, @dir) = ();
print "start scan $cbranch ...\n";
opendir(Z, $cbranch) or do{ print "can?t opendir $cbranch: $!\n"; return 0 };@dir = readdir Z;
while(<@dir>)
{
next if /^\./;
push@branches,$_ if -d "$cbranch/$_";
push@keys,$_ if -f "$cbranch/$_";
}
closedir Z;
#$C{$_}=oslurp("$cbranch/$_") for @keys;
$C->{$_}="$cbranch/$_" for @keys;
foreach ( @branches) {
$C->{$_}= {};
cfg_readbranch("$cbranch/$_", $C->{$_} );
}
return 1;
}my %C;
print Dumper(\%C),"\n", if cfg_readbranch('./testdir', \%C);
-------------------------------
output:
$VAR1 = {
'file2' => './testdir/file2',
'file1' => './testdir/file1',
'file3' => './testdir/file3',
'dir2' => {},
'dir1' => {
'dir5' => {},
'dir6' => {
'file1' => './testdir/dir1/dir6/file1',
'file12' => './testdir/dir1/dir6/file12'
}
}
};
Благодарю :)