• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Perl: Mehrdimensionales Array

TitanNano

New member
Hallo,

Ich bekomme von der MySQL Datenbank die Ergebnis Tabelle, Zeile für Zeile als Array zurück. Um das nun weiter verarbeiten zu können, würde ich gerne alles in ein mehrdimensionales Array packen. ich habe folgende Syntaxen schon probiert:

Code:
  while (@i = $abfrage->fetchrow_array){
    print "$i[0]::";
    @antwort[$#antwort]= @i;
    print "$antwort[-1][0]::";
    }

bzw.:
Code:
  while (@i = $abfrage->fetchrow_array){
    print "$i[0]::";
    push(@antwort, @i);
    print "$antwort[-1][0]::";
    }

Leider ist bei beiden malen $antwort[0][0] leer....

Wie ist den der Richtige Syntax??

MfG. TitanNano
 
Code:
#!/usr/bin/perl
use strict;
use warnings;

my %ergebnis;
my $zeilennr = 1;
my @zeile = ('foo','bar');
# Hash-Array-Mischung:
$ergebnis{$zeilennr} = [@zeile];
print $ergebnis{1}[1]."\n"; # bar
# Reines Array:
my @ergebnis;
$ergebnis[$zeilennr] = [@zeile];
print $ergebnis[1][1]."\n"; # bar
Habe Variante 1 Hash/Array genannt, weil Perl bei einem Array alle Elemente im Speicher reserviert. Wenn also die Zeilennummer bei 1000 anfängt, belegen die ungenutzten ersten 999 ebenfalls Speicher. Das macht ein Hash nicht, daher verwende ich möglichst wenig Array's in Perl. Weiß nicht, wie deine Struktur und Logik aussieht.
Bei Fragen ruhig fragen.
 
Zuletzt bearbeitet:
Das ist nicht richtig. Wenn ein Index existiert, existieren alle Indizes davor auch, aber das heißt nicht, dass Speicher belegt werden. Arrays sind extrem effektiv und sollten daher auch einem Hash bevorzugt werden.

@TitanoNano: Du solltest dir mal die Perl Doku durchschauen, vor allem die Seiten über Arrays und über Listen von Listen (Perllol). Das sind Grundlagen!
 
@Schlauer: Ich sprach nur von dem Fall, dass viele Plätze ungenutzt wären, nicht generell von Arrays!!
Hier der Nachweis:

Code:
#!/usr/bin/perl 
use strict;
use warnings;

use Devel::Size qw(size total_size);

my @array;
$array[1001] = 'foo';

print 'Size array:       ' , size(\@array)       , "\n"; 
print 'TotalSize array:  ' , total_size(\@array) , "\n"; 
print "\n";

my %hash = ( 1001 => 'foo' );

print 'Size hash:        ' , size(\%hash)       , "\n"; 
print 'TotalSize hash:   ' , total_size(\%hash) , "\n"; 
print "\n";

Size array: 4048
TotalSize array: 4076

Size hash: 110
TotalSize hash: 138
 
Naja, da ist die Frage, warum ein Array mit einem Index von 1000 anfängt und es keinen Eintrag davor gibt?

Das macht keinen wirklichen Sinn und man sollte die Logik der Anwendung verbessern. Aber der Vorteil des Array läßt sich schon erkennen, 1000 Einträge bräuchten nur einen Bruchteil Speicher von tausend Hashwerten.

Aber in dem Fall von TitanoNano geht es auch gar nicht um diese Frage. In seinem Fall würde ich ein Array of Hashes vorziehen, das macht das Skript lesbarer.

Aber wenn es wirklich um Geschwindigkeit mit grossen Datenmengen ginge, muss man Arrays empfehlen. Ein Hash Zugriff ist deutlich langsamer.
 
Zurück
Oben