You are clearing the hash and not the array also.
use warnings;
use strict;
use Data::Dumper;
my $string = "column08=Submit & column10=Delivered & column09=Somethin
+g";
my @matches = grep defined, split / ([|&]) /, $string;
my %hash = ();
my @return_array = ();
my @symbol_array = (); # dead code
foreach my $one (@matches)
{
if (($one =~ tr/=//) == 1)
{
my ($key,$value)=(split /=/,$one);
%hash = ();
@return_array = (); # clear the array also
$hash{'term'}{$key} = $value;
push (@return_array,%hash);
}
else # dead code
{
push (@symbol_array,$one);
}
}
print Dumper \%hash;
print Dumper \@return_array;
...