I guess you just don't fully understand how references work. You're basically pushing a reference to the same array, so no wonder you have exact same contents of this array.
What you need to do is to create a new array reference. Here's the proper code:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array;
my $subarray = [];
# Puash to array
my $hashref1 = {
key1 => 'value1_1',
key2 => 'value1_2',
key3 => $subarray
};
push (@array, $hashref1);
# push some data in subarray
push ( @$subarray, 'value1' );
# create a new subarray
$subarray = [];
# Puash to array
my $hashref2 = {
key1 => 'value2_1',
key2 => 'value2_2',
key3 => $subarray
};
push (@array, $hashref2);
# push some data in subarray
push ( @$subarray, 'value2' );
print "hashref1:\n".Dumper($hashref1);
print "hashref2:\n".Dumper($hashref2);
print "array:\n".Dumper(@array);