#!/usr/bin/env perl use strictures; use JSON; use Data::Dump "dump"; use Test::More; my $in = decode_json '{"OWNER":"KeyProjects","Region":"Southern","District":"Arid","PLANTNO":"Sunset View","COMPT":"A08","age1":null,"ht1":null,"age2":null,"ht2":null,"age3":null,"ht3":null,"age4":null,"ht4":null,"age5":null,"ht5":null,"age6":null,"ht6":null,"age1":null,"ht1":null,"age2":null,"ht2":null,"age3":null,"ht3":null,"age4":null,"ht4":null,"age5":null,"ht5":null,"age6":null,"ht6":null,"wc":"EF1"}'; my $out = decode_json '{"OWNER":"KeyProjects","Region":"Southern","District":"Arid","PLANTNO":"Sunset View","COMPT":"A08","scheduled":{"age1":null,"ht1":null,"age2":null,"ht2":null,"age3":null,"ht3":null,"age4":null,"ht4":null,"age5":null,"ht5":null,"age6":null,"ht6":null},"completed":{"age1":null,"ht1":null,"age2":null,"ht2":null,"age3":null,"ht3":null,"age4":null,"ht4":null,"age5":null,"ht5":null,"age6":null,"ht6":null},"wc":"EF1"}'; my $planned = qr/\A (?: age\d+ | ht\d+ ) \z/x; my $corrected = $in; for my $key ( keys %{$corrected} ) { if ( $key =~ $planned ) { $corrected->{completed}{$key} = $corrected->{scheduled}{$key} = delete $corrected->{$key}; } } # print dump $in; is_deeply $out, $corrected, "Corrected data matches expectations"; diag encode_json $corrected; done_testing();