Guest Enana-> push @data,[@$ref] habe ich in der while Schleife übergeben weil $ref sich die ganze Zeit selbst überschreibt.
Es wird nichts überschreiben den du benutzt 
my:
while(my $ref=$sth->fetchrow_arrayref) {
  ...
}
 
 
Das was in in den runden Klammern zu 
while steht gehört vom Geltungsbereich schon zum Inhalt der Schleife.
ganz einfacher Test: 
my $x=100; while(my $x=0){} print $x
 
 
 Wenn du recht hast müsste in der Ausgabe "0" erscheinen. Es kommt aber "100".
Was bedeutet das du dies schreiben kannst ohne die Inhalte zu überschreiben: 
while(my $ref=$sth->fetchrow_arrayref){
  push( @data, $ref );
}
 
 
 Denn es wird bei jedem Durchlauf die Variable neu erzeugt.
Wenn du aber das 
my weg lässt hast du recht, da die Variable außerhalb der Schleife definiert ist:
my $x=100; while($x=0){} print $x
 
 
die Ausgabe ist hier nun "0"
Noch eine Bemerkung am Rande. Mir scheint es das du kein 
use warnings; verwendest. Das hätte dir bei deinem Problem mit den Refenzen zumindest Aufgezeigt das du da was nicht 100% korrekt machst. Auch 
use strict; ist hilfreich. Man sollte immer diese beiden Pragmas benutzen.