Schrift
[thread]7193[/thread]

Arrays



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2005-08-08 13:07
#57020 #57020
Hallo, ich hätte mal ne Frage zu den Arrays in Perl.
Ich ab ein indizierte Array und will diese in einem Buffer zwischenspeichern um sie später wieder rauszuholen. Folgender Code veranschaulicht dies, er funktioniert aber nicht.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my %source;
my %dest;
my @buffer;

$source{key1} = "value1";
$source{key2} = "value2";
push (@buffer, %source);
$source{key1} = "value3";
$source{key2} = "value4";
push (@buffer, %source);

#(...)

%source = pop(@buffer);
print $source{key1};

Beim compilieren kommt der Fehler
Code: (dl )
Odd number of elements in hash assignment
bei '%source = pop(@buffer);' mit dem ich nichts anfangen kann.

Hat jemand ne Idee was ich machen kann ?
Ronnie
 2005-08-08 13:15
#57021 #57021
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Du mischst wild Arrays und Hashes (assoziative Arrays), das kann so nicht gehen. Das pop entnimmt deinem Buffer nur EIN! Element, für eine Zuweisung an ein Hash brauchst du aber mindestens zwei (oder vielfache davon) Elemente.

Das beste was du machen könntest wäre:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %source;
my %dest;
my @buffer;

$source{key1} = "value1";
$source{key2} = "value2";
push( @buffer, %source );
$source{key1} = "value3";
$source{key2} = "value4";
push( @buffer, %source );

#(...)

print Dumper \@buffer;

%dest = splice @buffer, 0, 2;
print Dumper \%dest;

wobei du das Problem hast, wenn du das Hash in ein Array pushst du nicht erwarten kannst, das es beim pop in der selben Reihenfolge wieder erscheint, da die interne Reihenfolge des Hashs nicht bestimmbar ist. Wahrscheinlich ist eine zusammengesetzte Datenstruktur sinnvoller.\n\n

<!--EDIT|Ronnie|1123492943-->
Relais
 2005-08-08 13:52
#57022 #57022
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Guest,08.08.2005, 11:07]Ich ab ein indizierte Array...[/quote]
Du redest von Hashes als "indizierten Arrays"?


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my ( @buffer, %source, %dest )

$source{key1} = "value1";
$source{key2} = "value2";

push (@buffer, \%source); # beachte den "\"

$source{key1} = "value3";
$source{key2} = "value4";

push (@buffer, \%source); # beachte den "\"

#(...)

%source = %{ pop(@buffer) }; # und hier das %{ }

print $source{key1};


Perl handhabt Arrays [@...] und Hashes [%...] als Listen [ (...) ], wenn man sie direkt übergibt, und so entstanden in Deinem Array eine Folge der Keys und Values aus dem Hash - jedoch kein Hash mehr.

Durch den Backslash "\" wurde der vollständige Hash nun per Referenz in den Array eingetragen.
Um daraus wieder einen Hash zu erhalten empfiehlt sich die Schreibweise mit dem %{ ... } drumherum.\n\n

<!--EDIT|Relais|1123494753-->
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Ronnie
 2005-08-08 13:57
#57023 #57023
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@Relais: Das gibt aber auch kaum Sinn, da die Keys doppelt verwendet werden und zweimal der selbe Hash referenziert wird:
Code: (dl )
1
2
3
4
5
6
7
$VAR1 = [
{
'key2' => 'value4',
'key1' => 'value3'
},
$VAR1->[0]
];
\n\n

<!--EDIT|Ronnie|1123495110-->
Gast Gast
 2005-08-08 14:08
#57024 #57024
[quote=Ronnie,08.08.2005, 11:57]@Relais: Das gibt aber auch kaum Sinn, da die Keys doppelt verwendet werden und zweimal der selbe Hash referenziert wird:[/quote]
Stimmt. Dann vielleicht doch eher (ungetestet) das hier?

Code: (dl )
push @buffer, { %source }; 
Relais
 2005-08-08 14:11
#57025 #57025
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Ronnie,08.08.2005, 11:57]@Relais: Das gibt aber auch kaum Sinn, da die Keys doppelt verwendet werden und zweimal der selbe Hash referenziert wird[/quote]
Stimmt auffällig. Dann also derart:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my ( @buffer, %source, %dest )

$source{key1} = "value1";
$source{key2} = "value2";

push (@buffer, { %source } ); # beachte die { ... }

$source{key1} = "value3";
$source{key2} = "value4";

push (@buffer, { %source } ); # beachte die { ... }

#(...)

%source = %{ pop(@buffer) }; # und hier das %{ }

print $source{key1};


Perl handhabt Arrays [@...] und Hashes [%...] als Listen [ (...) ], wenn man sie direkt übergibt, und so entstanden in Deinem Array eine Folge der Keys und Values aus dem Hash - jedoch kein Hash mehr.

Durch die Schleifenklammern { ... } wurde der vollständige Hash nun per Referenz in den Array eingetragen.
Um daraus wieder einen Hash zu erhalten empfiehlt sich die Schreibweise mit dem %{ ... } drumherum..
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Snubnose
 2005-08-08 15:30
#57026 #57026
User since
2005-08-08
8 Artikel
BenutzerIn
[default_avatar]
vielen Dank genau das wars....
pfuschi
 2005-08-08 17:33
#57027 #57027
User since
2004-03-31
198 Artikel
BenutzerIn
[default_avatar]
OT: hat dein Nick zufällig etwas mit einer legendären schwäbischen "Groovecore" Band zu tun???
PCE - Editor für Perl in Perl
Bookzilla.de - Mit jedem Kauf OpenSource unterstützen
"I know I can't hold the hate inside my mind
cause what consumes your thoughts controls your life"
- Creed
Snubnose
 2005-08-08 21:08
#57028 #57028
User since
2005-08-08
8 Artikel
BenutzerIn
[default_avatar]
exakt, daher kommt mein Name
"Melodic-Groovecore" Snubnose
echt Schade, dass sie es nicht mehr gibt....
pfuschi
 2005-08-08 21:12
#57029 #57029
User since
2004-03-31
198 Artikel
BenutzerIn
[default_avatar]
Joh, die Jungs waren echt klasse... kommst du zufällig aus der Gegend?
Bist du jetzt immer noch auf Konzerten in der Szene?
PCE - Editor für Perl in Perl
Bookzilla.de - Mit jedem Kauf OpenSource unterstützen
"I know I can't hold the hate inside my mind
cause what consumes your thoughts controls your life"
- Creed
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-08-08 13:07.