Thread C(isch) Perl(en) (C-Datenstrukturen nach Perl) (14 answers)
Opened by tonewheel at 2012-08-21 21:46

Linuxer
 2012-08-21 22:37
#161239 #161239
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi, ich denke, es wären sowohl ein AoA (Array of Arrays) als auch ein AoH (Array of Hashes) denkbar.
Ein AoH hätte den Vorteil, dass man auf die Felder Zugriff über Namen/Hash-Keys hat.

Hier mal mein Versuch (mit AoH), Dein Beispiel nachzubilden:
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
23
24
25
#! /usr/bin/env perl
use strict;
use warnings;

use Storable qw(dclone);

my $max_foo = 4;
my $max_bar = 3;;

my %foo = (
    a => undef,
    b => undef,
    s => undef,
);

my %bar = (
    x => undef,
    y => undef,
    foo => [ map { dclone(\%foo) } 1 .. $max_foo ],
);

my @_bar = map { dclone( \%bar ) } 1 .. $max_bar;

require Data::Dumper;
print Data::Dumper->Dump( [ \@_bar ], [ "*_bar" ] );

Wenn man die innere Struktur als eigene Struktur vordefiniert (wie hier %foo), muss man darauf achten, dass die Struktur nicht wiederholt referenziert wird (also mit einem simplen \%foo; und dass Referenzen, die in der inneren Struktur schon existieren, nicht einfach kopiert, sondern geklont werden)), daher das dclone(). Möchte man sich das sparen, könnte man das auch direkt mit anonymen Referenzen tun:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /usr/bin/env perl
use strict;
use warnings;

use Storable qw(dclone);

my $max_foo = 4;
my $max_bar = 3;;

my @_bar2 = map {
    {
      x => undef,
      y => undef,
      foo => [ map { { a => undef, b => undef, s => undef } } 1 .. $max_foo ]
    }
} 1 .. $max_bar;

require Data::Dumper;
print Data::Dumper->new( [ \@_bar2 ], [ "*_bar" ] )->Sortkeys(1)->Dump();

Last edited: 2012-08-21 23:12:00 +0200 (CEST)
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!

View full thread C(isch) Perl(en) (C-Datenstrukturen nach Perl)