Thread "Beliebig" tiefes Hash mit keys aus Array erstellen
(22 answers)
Opened by shi8dao at 2011-06-21 08:35 2011-06-21T06:35:16 shi8dao 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 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 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"'
|