Во-первых, очень сомневаюсь, что вот эта конструкция может корректно работать:
push @a, [split /|/] while <>; | - специальный символ в перловых регекспах, надо ескейпить, и лучше бы результат split сохранять в отдельном массиве. Получится подлиннее, но зато работает:
#!/usr/bin/perl
use Data::Dumper;
while ( my $str = <> ) {
chomp $str;
my @split = split /\\|/, $str;
push @a, \\@split;
}
#push @a, [split /\\|/] while <> ne "quit\\n";
#print Dumper( @a );
for(my $y=0; $y<@a; $y++) {
for(my $x=0; $x<@{$a[$y]}; $x++) {
format STDOUT=
@<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<
$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x]
.
write;
}
}
Остальное не трогал - зачем вообще выводить по восемь одинаковых слов в строке

?