As you can see, I have 'mains' level which contains an array of objects that each one of them contains subs array and main_name and maiin_path fields.{ 'number_of_subs' => 5, 'report_map' => 'test5', 'number_of_mains' => 2, 'ystem_start_time' => '1564574677317', 'system_id' => '453521412412', 'timestamp' => 1564574676, 'user' => 'asdasvb' 'mains' => [ { 'main_path' => 'play_ground/MAIN', 'subs' => [ { 'info' => [ { 'version' => [ 'tcsh' ], 'group' => 'pkgs' }, { 'version' => [ '6.13.00' ], 'group' => 'tcsh' } ], 'sub_path' => 'GROUP1/Test1', 'sub_name' => 'Test1' }, { 'data' => [ { 'version' => [ 'tcsh' ], 'group' => 'pkgs' }, { 'version' => [ '6.13.00' ], 'group' => 'tcsh' } ], 'sub_path' => 'GROUP2', 'sub_name' => 'GROUP2' }, { 'info' => [ { 'version' => [ '3.14' ], 'group' => 'A' }, { 'version' => [ '2.56' ], 'group' => 'B' }, { 'version' => [ '6.13.00', '6.14.00' ], 'group' => 'C' } ], 'sub_path' => 'Test1', 'sub_name' => 'Test1' } ], 'main_name' => 'MAIN' }, { 'main_path' => 'play_ground/MAIN1', 'subs' => [ { 'info' => [ { 'version' => [ 'tcsh' ], 'group' => 'pkgs' }, { 'version' => [ '6.13.00' ], 'group' => 'tcsh' } ], 'sub_path' => 'TEST2/SUB1', 'sub_group' => 'SUB1' }, { 'info' => [ { 'version' => [ 'tcsh' ], 'group' => 'pkgs' }, { 'version' => [ '6.13.00' ], 'group' => 'tcsh' } ], 'sub_path' => 'TEST2/SUB2', 'sub_name' => 'SUB2' } ], 'main_name' => 'MAIN1' } ], }
Second report:main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "ABC", version ="4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Third report:main1: subs1: sub_name: sub2 sub_path: path/to/sub2 info: { group = "ABC", version = "1.5.6","4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Fourth report:main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "ABC", version = "1.5.6","4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Fifth report:main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "XYZ", version = "1.5.6","4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Then the merge will be as follows:main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "XYZ", version = "1.5.6","4.2.1" } main_name: ROOT_OTHER main_path: /PATH/TO/ROOT
Merge of first and third: (Explanation: will be same as the first report because we take the latest. In that case they have same main, same subs and same info level)main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "ABC", version = "4.2.1" } subs2: sub_name: sub2 sub_path: path/to/sub2 info: { group = "ABC", version = "1.5.6","4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Merge of first and fourth: (Explanation: In that case they have same main, same subs and but not same info level)main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "ABC", version ="4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Merge of first and fifth: (Explanation: they have different main_name)main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "XYZ", version = "1.5.6","4.2.1" },{ group = " +ABC", version ="4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT
Each one of the reports contains a 'timestamp' so I though of iterating through each one of the blocks and take the latest but it does not feel efficient,main1: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "ABC", version ="4.2.1" } main_name: ROOT main_path: /PATH/TO/ROOT main2: subs1: sub_name: sub1 sub_path: path/to/sub1 info: { group = "XYZ", version = "1.5.6","4.2.1" } main_name: ROOT_OTHER main_path: /PATH/TO/ROOT
I'm stack because in the "subs" I need to use the timestamp that I don't have.my %output_reports; foreach my $main (@{$data->{"mains"}}) { my $uniq_main = 1; foreach my $new_main (@{$output_reports{"mains"}}) { if ($main->{"main_path"} eq $new_main->{"main_path"} && $main- +>{"main_name"} eq $new_main->{"main_name"}) { $uniq_main = 0; my $uniq_sub = 1; foreach my $sub (@{$main->{"subs"}}) { foreach my $new_sub (@{$new_main->{"subs"}) { if ($sub->{"sub_path"} eq $new_sub->{"sub_path"} & +& $sub->{"sub_name"} eq $new_sub->{"sub_name"}) { # Stuck here - I need the timestamp } } } } } if ($uniq_main) { push(@{$output_reports{"mains"}},$main); } }
In reply to Parsing output by ovedpo15
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |