Below is how i did it. The data is saved in a separate file, and read line by line. There are other ways to read file, eg.
File::Slurp or
File::Map.
It could have been done in 1 while loop, but i prefer 2 steps: 1st process the data, 2nd output the data. Then the code can be put in short subroutines, which i can easily create tests for them.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Terse = 1;
my $file = 'perlmonk_1170305_02_data.txt';
open FH, $file or die "Couldn't open file: [$!]\n";
my $data = {};
my $hash = {};
while ( <FH> )
{
my $line = $_;
chomp $line;
if ( $line =~ m/(-){2,}/ )
{
# save all stored data if we see dashes line
my $program = $hash->{Program} || '';
my $jira = $hash->{JIRA} || '';
if ( $program && $jira )
{
push @{ $data->{ $program }{ $jira }}, $hash;
$hash = {};
}
}
else
{
# store data in a temp hash
my ( $key, $value ) = split /:\s*/, $line;
$hash->{ $key } = $value;
}
}
#print 'data = ' . Dumper( $data );
foreach my $prg ( sort keys %{ $data } )
{
print "===========================================================
+=\n";
print " PROGRAM : $prg
+ \n";
print "===========================================================
+=\n";
foreach my $jira ( sort keys %{ $data->{ $prg }})
{
print "******************\n";
print "JIRA ID : $jira\n";
print "******************\n";
foreach my $hash ( @{ $data->{ $prg }{ $jira }} )
{
foreach my $key ( keys %{ $hash })
{
# print the data except Program and JIRA
next if $key =~ m/(Program|JIRA)/;
print " $key => $hash->{ $key }\n";
}
print "\n";
}
}
}
Output:
============================================================
PROGRAM : Development
============================================================
******************
JIRA ID : COM-1234
******************
rev => r345676
Reviewer => John Wick
Description => Genral fix
rev => r909276
Reviewer => None
Description => Updating Received
============================================================
PROGRAM : Testing
============================================================
******************
JIRA ID : COM-6789
******************
rev => r876391
Reviewer => Balise Mat
Description => Audited
rev => r698392
Reviewer => Chan Joe
Description => SO hwat
rev => r327896
Reviewer => Chan Joe
Description => Paid the Due