I am not quite sure about your "rules" for parsing the input. Here is one possibility:
Update: I did the following code rather quickly. I changed my mind during the middle of coding and didn't revise the previously written code. process_record() could be shortened by calling process_sub_record() a couple of times instead of just once. This is a small detail and should be obvious how to do. The OP is still not completely clear as to whether these "Something" and "Something Else" strings are standard invariant sub-headers or whether they can vary. Also not spec'd is whether the number of lines in the record can vary or not.
Well, Ok, another update... The change to call process_sub_record() twice was so extremely trivial, that I did it and put original code in a readmore block. Perhaps it is not obvious but this implementation allows blank and comment lines at the beginning or end of the file - I have often found that feature useful in my work.
#!/usr/bin/perl
use strict;
use warnings;
while (defined (my $x= <DATA>))
{
process_record ($x) if ($x =~ /^JOB::/)
}
sub process_record
{
my $job = shift;
chomp $job;
print "$job\n";
process_sub_record();
process_sub_record();
}
sub process_sub_record
{
my $sub_record = <DATA>;
chomp $sub_record;
for (1..4)
{
my $nextLine = <DATA>;
chomp $nextLine;
print "~~$sub_record~~ ", "$nextLine\n";
}
}
=PRINTS:
JOB::HEREISASTRING
~~Something~~ StringA
~~Something~~ StringB
~~Something~~ StringC
~~Something~~ StringD
~~Something Else~~ StringE
~~Something Else~~ StringF
~~Something Else~~ StringG
~~Something Else~~ StringH
JOB::HEREISANOTHERSTRING
~~Something~~ StringI
~~Something~~ StringJ
~~Something~~ StringK
~~Something~~ StringL
~~Something Else~~ StringM
~~Something Else~~ StringN
~~Something Else~~ StringO
~~Something Else~~ StringP
=cut
__DATA__
JOB::HEREISASTRING
Something
StringA
StringB
StringC
StringD
Something Else
StringE
StringF
StringG
StringH
JOB::HEREISANOTHERSTRING
Something
StringI
StringJ
StringK
StringL
Something Else
StringM
StringN
StringO
StringP
#!/usr/bin/perl
use strict;
use warnings;
while (defined (my $x= <DATA>))
{
process_record ($x) if ($x =~ /^JOB::/)
}
sub process_record
{
my $job = shift;
chomp $job;
print "$job\n";
my $firstLine = <DATA>;
chomp $firstLine;
for (1..4)
{
my $nextLine = <DATA>;
chomp $nextLine;
print "~~$firstLine~~ ", "$nextLine\n";
}
process_sub_record();
}
sub process_sub_record
{
my $sub_record = <DATA>;
chomp $sub_record;
for (1..4)
{
my $nextLine = <DATA>;
chomp $nextLine;
print "~~$sub_record~~ ", "$nextLine\n";
}
}
=PRINTS:
JOB::HEREISASTRING
~~Something~~ StringA
~~Something~~ StringB
~~Something~~ StringC
~~Something~~ StringD
~~Something Else~~ StringE
~~Something Else~~ StringF
~~Something Else~~ StringG
~~Something Else~~ StringH
JOB::HEREISANOTHERSTRING
~~Something~~ StringI
~~Something~~ StringJ
~~Something~~ StringK
~~Something~~ StringL
~~Something Else~~ StringM
~~Something Else~~ StringN
~~Something Else~~ StringO
~~Something Else~~ StringP
=cut
__DATA__
JOB::HEREISASTRING
Something
StringA
StringB
StringC
StringD
Something Else
StringE
StringF
StringG
StringH
JOB::HEREISANOTHERSTRING
Something
StringI
StringJ
StringK
StringL
Something Else
StringM
StringN
StringO
StringP