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

MatthiasW
 2011-06-21 09:13
#149803 #149803
User since
2008-01-27
367 articles
BenutzerIn
[default_avatar]
2011-06-21T06:35:16 shi8dao
Baue ich mir da einen String zusammen und benutze eval? Das klaenge fuer mich evil ;-).

Eigentlich baut man sich so etwas folgendermaßen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub insert {
    my $hash = shift;
    #edit: werte wurden überschrieben:
    #$hash = $hash->{$_} = {} for @_;
    $hash = $hash->{$_} ||= {} for @_;
    return $hash;
}

insert(\%tmp, @names);


2011-06-21T06:35:16 shi8dao
Spaeter muss ich durch alle Eintraege iterieren.
Wegen der Struktur bietet sich ja eine rekursive Funktion an, die sich selbst wieder aufruft, wenn ein Value ein Hash ist.
Benutze ich dazu am besten UNIVERSAL::isa($value, 'HASH')?

Nein, isa kann man nur auf Klassen und Objekte anwenden. Es liefert zurück ob eine Klasse/ein Objekt von einer bestimmten Klasse erbt, oder eine bestimmte Klasse "ist"/instanziiert.

Um zu überprüfen ob es sich bei $value um einen Hash handelt kann man ref($value) eq 'HASH' verwenden, oder sogar reftype($value) eq 'HASH' aus CPAN:Scalar::Util. Letzteres funktioniert auch auf Objekte, das Standard-ref() liefert dann nämlich den Klassennamen. Vorher muss man noch sicherstellen, dass $value tatsächlich eine Referenz enthält, sonst bekommt man eine hässliche Warnung, weil man einen undefinierten Wert - ref() und reftype() liefern dann undef - mit einem String vergleicht.

Bei obigem Code kann man z.B. so drüber laufen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub traverse {
    my $hash = shift;

    print "do something with: @_\n" if @_;

    return if not ref $hash or ref $hash ne 'HASH';
    traverse($hash->{$_}, $_) for keys %$hash;
}

traverse(\%tmp);

MfG
Last edited: 2011-06-21 11:53:25 +0200 (CEST)
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'

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