The problem with the code you showed is that my @lines = <FILE>; reads the lines into the array, with each separate line in its own array entry, so the regex never sees more than one \n. One solution is to do what AnomalousMonk has already shown, by reading the entire file into one string. Here is one more way that reads the entire file into memory, using the "paragraph mode" supported by $/:
use warnings;
use strict;
use Data::Dump;
open my $fh, '<', 'test.txt' or die $!;
my @lines = do { local $/=''; <$fh> };
chomp @lines;
close $fh;
dd @lines;
__END__
("line1\nline2\n", "line4\n", "line7\nline8\n", "line9\n")
But you don't necessarily need to read the entire file into memory first, you can also do this operation line-by-line, as you're reading the file. For example:
open my $fh, '<', 'test.txt' or die $!;
while (my $line = <$fh>) {
print $line if length $line && $line ne $/;
# - OR -
push @newlines, $line if length $line && $line ne $/;
# - OR -
chomp($line);
next unless length $line;
print $line, "\n";
# etc.
}
close $fh;