-
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;