Thread "Beliebig" tiefes Hash mit keys aus Array erstellen (22 answers)
Opened by shi8dao at 2011-06-21 08:35

topeg
 2011-06-21 09:46
#149810 #149810
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das hat unter Umständen ein Problem wenn mehrere ähnliche Pfade auftauchen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my @var = (
  [qw(Hund Katze Maus)],
  [qw(Hund Katze Ratte)],
  [qw(Hund Tiger Ratte)],
  [qw(Hund Tiger Maus)],
)
my $hashref = {};
for my $arr ( @var )
{
  my $tmp = $hashref;
  for(@$arr)
  {
    $tmp->{$_} = {};
    $tmp = $tmp->{$_}
  }
}

print Dumper $hashref;


Bei deinem Code werden alte "Pfade" überschrieben.
man kann das mit einer Abfrage verhindern:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my @var = (
  [qw(Hund Katze Maus)],
  [qw(Hund Katze Ratte)],
  [qw(Hund Tiger Ratte)],
  [qw(Hund Tiger Maus)],
)
my $hashref = {};
for my $arr ( @var )
{
  my $tmp = $hashref;
  for(@$arr)
  {
    $tmp->{$_} = {} unless( exists $tmp->{$_} );
    $tmp = $tmp->{$_}
  }
}

print Dumper $hashref;


Aber ich finde es ist besser die Autovivifikation zu nutzen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my @var = (
  [qw(Hund Katze Maus)],
  [qw(Hund Katze Ratte)],
  [qw(Hund Tiger Ratte)],
  [qw(Hund Tiger Maus)],
);

my $hashref = {};
for my $arr ( @var )
{
  my $tmp = \$hashref;
  $tmp = \$$tmp->{$_} for(@$arr);
  $$tmp={};
}

print Dumper($hashref);

Last edited: 2011-06-21 09:58:24 +0200 (CEST)

View full thread "Beliebig" tiefes Hash mit keys aus Array erstellen