Thread In anonymes Hash umwandeln (9 answers)
Opened by J-jayz-Z at 2005-11-15 21:03

pKai
 2005-11-16 12:46
#60193 #60193
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;
use Data::Dumper ();

my $S = {};

sub splitTo {
my ($pH, $pA, $leaf) = @_;
$pA = [ grep $_, split /\//, $pA ] unless ref $pA;
return $leaf unless @$pA;
my $nxt = shift @$pA;
my $pHN = ref $pH->{$nxt} ? $pH->{$nxt} : {};
$pH->{$nxt} = splitTo($pHN, $pA, $leaf);
$pH;
}

splitTo($S, 'foo/bar', 'oops');
splitTo($S, 'foo/bar/baz', '\\o/');
splitTo($S, 'foo/gnu', 'gnat');

print Data::Dumper->Dump([$S], ['S']);
Code: (dl )
1
2
3
4
5
6
7
8
$S = {
'foo' => {
'bar' => {
'baz' => '\\o/'
},
'gnu' => 'gnat'
}
};

Hier wird allerdings gnadenlos überschrieben:
Code: (dl )
1
2
3
splitTo($S, 'foo/gnu', 'gnat');
splitTo($S, 'foo/bar/baz', '\\o/');
splitTo($S, 'foo/bar', 'oops');
Code: (dl )
1
2
3
4
5
6
$S = {
'foo' => {
'bar' => 'oops',
'gnu' => 'gnat'
}
};


Edit: Wenn überschreiben von Hashrefs durch Skalare nicht gewünscht ist, muss es in der sub
Code: (dl )
    return(keys %$pH ? $pH : $leaf) unless @$pA;
in der return-Zeile heißen.

Edit2: Und noch der Vollständigkeit halber: Wenn im Eingabepfad "0" als Teil auftreten kann, die Prüfung im grep von $_ auf length $_ umstellen\n\n

<!--EDIT|pKai|1132144291-->
I sense a soul in search of answers.

View full thread In anonymes Hash umwandeln