Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10399[/thread]

Als Value eines Hashes will ich ein Array mitgeben



<< >> 4 Einträge, 1 Seite
krusty
 2007-09-15 12:01
#99483 #99483
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hallo und guten Morgen,

nach längerer Abwesenheit, habe ich anscheinend wieder so einiges vergessen.
Könnt ihr mir auf die Sprünge helfen?

Ich habe folgendes Problem. Ich möchte ein Array als Value eines Hashes benutzen. Ich habe mir dazu folgenden Code ausgedacht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
### Datenbankverbindung herstellen ###
my $db          = DBI->connect($data_source, $user, $password) || die "Database connection not made: $DBI::errstr\n";

### Teststatement ###
my $s_select_si = "select screenitemid, x, y from screens_items where screenid = '$sID'";
my $sth         = $db->prepare($s_select_si) || die "$s_select_si: $db->errstr kann nicht vorbereitet werden!\n";
my $rc          = $sth->execute || die "Die Query: $sth->errstr kann nicht ausgefuehrt werden!\n";
if ($rc < 1) {
        print "Es ist ein Fehler beim Ausfuehren des Select Statements $s_select_si aufgetreten: ".$db->errstr."\n";
}
my @erg         = ();
my %order       = ();
my @achsen      = ();
my $screenid    = "";
my @yx          = ();

while( @erg = $sth->fetchrow_array)
{
        @achsen = ("$erg[1]", "$erg[2]");
        %order{"$erg[0]"} =  \@achsen;
}
$sth->finish();


Wie soll es anders sein, dieser funktioniert leider nicht. Habt ihr eine Idee warum nicht?

Gruß
Krusty
Linuxer
 2007-09-15 12:31
#99484 #99484
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Hast Du denn eine Idee, was Du mit "funktioniert leider nicht" meinst?

Auf den ersten Blick ist zu erkennen, dass Du @achsen ausserhalb der Schleife deklarierst. Dadurch nutzt Du bei der Zuweisung immer die gleiche Speicheradresse und @achsen wird immer wieder neu überschrieben.

Ich würde folgendes vorschlagen, so kannst Du Dir @achsen sogar ganz sparen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
my %order       = ();
my $screenid    = "";
my @yx          = ();

while( my @erg = $sth->fetchrow_array)
{
        $order{$erg[0]} =  [ @erg[1,2] ];
}


Ansonsten musst Du @achsen entweder in der Schleife deklarieren:
Code (perl): (dl )
1
2
3
4
while ( bla ) {
  my @achsen = ( blubb );
  $order{$erg[0]} = \@achesn;
}


Oder Du nutzt eine Referenz auf ein anonymes Array:
Code (perl): (dl )
1
2
3
4
while ( bla ) {
  @achsen = ( blubb );
  $order{$erg[0]} = [ @achsen ];
}


Was mir sonst noch so aufgefallen ist:

Auf ein Element eines Hash greifst Du mit $hash{key} zu, nicht mit %hash{key}.

Du brauchst die Variable, die den Hash-Key benennt, nicht in "" setzen: also $order{$erg[0]}

Es ist Dir dringendst angeraten "use strict;" und "use warnings;" im Skript zu benutzen.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Ronnie
 2007-09-15 12:31
#99485 #99485
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Packe my @achsen mit in die while-Schleife, sonst hast du immer eine Referenz auf das selbe Array, das ständig überschrieben wird, oder nimm ein anonymes Array:
Code (perl): (dl )
1
2
3
4
5
while( @erg = $sth->fetchrow_array)
{
        # warn Dumper \@erg;
        $order{$erg[0]} =  [ $erg[1], $erg[2] ];
}

BTW: Wieso erzwingst du einen literalen Kontext mit "" ?
Struppi
 2007-09-15 16:24
#99490 #99490
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Auch das geht nicht:
Code: (dl )
"Die Query: $sth->errstr kann nicht ausgefuehrt werden!\n";

du musst die Funktion ausserhlab des Strings ausführen
<< >> 4 Einträge, 1 Seite



View all threads created 2007-09-15 12:01.