I looked back over this thread. You seem to have a misunderstanding of what "unless" does. "unless X" means the same thing as "if not X". I recommend that you use this 2nd syntax because it is often easier for beginners to understand. This makes no difference (or at least not any significant difference) in the execution speed of the compiled code.
I've given other solutions as have others in this thread. You have an overly complex "if" code block. Your "else" layer is not needed. In this code version, there is something to be done with a JOB line, a SOMETHING line or a SOMETHING ELSE line. Otherwise the current line is printed with the current header prepended. Somewhere else in this thread I gave a solution where these sub-header tags were not fixed in advance but has the limitation that each sub-section must have exactly 4 lines of "other strings".
In general the better your specify the problem, the better the answers tend to be.
#!/usr/bin/perl
use strict;
use warnings;
my $header ="";
while (defined (my $line= <DATA>))
{
next if $line =~ /^\s*$/; # skip blank lines
chomp $line;
if ($line =~ /^JOB::/)
{
print "$line\n";
}
elsif ($line =~ /^Something\s*$|^Something Else\s*$/ )
{
$header = $line; # don't print this line
}
else
{
print "$header $line\n"; #print line with current sub-header
}
}
=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