• Utils.pm

    822 823  
    8 8 @ISA = qw(Exporter);
    9 9 @EXPORT = qw( &eval_config_file
    10 10 &dump_config_file
    11 &decode_struct
    12 &encode_struct
    11 13 &_mkdir
    12 14 &looks_like_id
    13 15 &time_unix_to_timestamp
     
    204 206 my ($from, $to, $str) = @_;
    205 207 return Convert::Cyrillic::cstocs($from, $to, $str);
    206 208 }
    207
    208 209
    210 sub encode_struct {
    211 return recode_struct_recursive($_[0], 'encode');
    212 }
    213
    214 sub decode_struct {
    215 return recode_struct_recursive($_[0], 'decode');
    216 }
    217
    218 sub recode_struct_recursive {
    219 my ($struct, $action) = @_;
    220 return unless ref $struct;
    221
    222 my @stack;
    223 if ( ref $struct eq 'HASH' ) {
    224 foreach my $key ( keys %$struct ) {
    225 push @stack, { root => $struct, type => 'hash', key => $key };
    226 }
    227 } elsif ( ref $struct eq 'ARRAY' ) {
    228 for( my $i == 0; $i < scalar @$struct; $i++ ) {
    229 push @stack, { root => $struct, type => 'array', index => $i };
    230 }
    231 } else {
    232 return;
    233 }
    234 while ( @stack ) {
    235 my $data = pop @stack;
    236 if ( $data->{type} eq 'hash' ) {
    237 if ( ref $data->{root}{$data->{key}} eq 'HASH' ) {
    238 foreach my $key ( keys %{$data->{root}{$data->{key}}} ) {
    239 push @stack, { root => $data->{root}{$data->{key}}, type => 'hash', key => $key };
    240 }
    241 } elsif ( ref $data->{root}{$data->{key}} eq 'ARRAY' ) {
    242 for( my $i == 0; $i < scalar @{$data->{root}{$data->{key}}}; $i++ ) {
    243 push @stack, { root => $data->{root}{$data->{key}}, type => 'array', index => $i };
    244 }
    245 } else {
    246 if ( $action eq 'encode' ) {
    247 $data->{root}{$data->{key}} = Encode::encode('utf-8', $data->{root}{$data->{key}}, Encode::FB_HTMLCREF);
    248 } else {
    249 $data->{root}{$data->{key}} = Encode::decode('utf-8', $data->{root}{$data->{key}}, Encode::FB_HTMLCREF);
    250 }
    251 }
    252 } else {
    253 if ( ref $data->{root}->[$data->{index}] eq 'HASH' ) {
    254 foreach my $key ( keys %{$data->{root}->[$data->{index}]} ) {
    255 push @stack, { root => $data->{root}->[$data->{index}], type => 'hash', key => $key };
    256 }
    257 } elsif ( ref $data->{root}->[$data->{index}] eq 'ARRAY' ) {
    258 for( my $i == 0; $i < scalar @{$data->{root}->[$data->{index}]}; $i++ ) {
    259 push @stack, { root => $data->{root}->[$data->{index}], type => 'array', index => $i };
    260 }
    261 } else {
    262 if ( $action eq 'encode' ) {
    263 $data->{root}->[$data->{key}] = Encode::encode('utf-8', $data->{root}->[$data->{key}], Encode::FB_HTMLCREF);
    264 } else {
    265 $data->{root}->[$data->{key}] = Encode::decode('utf-8', $data->{root}->[$data->{key}], Encode::FB_HTMLCREF);
    266 }
    267 }
    268 }
    269 }
    270 return $struct;
    271 }
    272
    209 273 # загрузка модулей
    210 274 sub load_modules {
    211 275 my $list = shift;