Schrift
[thread]8497[/thread]

Hash-Zuweisungen...

Leser: 2


<< >> 10 Einträge, 1 Seite
pearl-man
 2006-11-12 14:30
#71662 #71662
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Hey, hey, grüßt euch!

hab da ma ne Frage:

ich kann einen hash ja so:
Code: (dl )
my %hash=('key1' => 'val1', 'key2' => 'val2');

oder so:
Code: (dl )
1
2
my $hash{'key1'}='val1';
$hash{'key2'}='val2';

was aber, wenn ich ein verschachtelten hash habe, like:
Code: (dl )
1
2
my $hash{'key1'}{'key1.1'}='val1.1';
$hash{'key1'}{'key1.2'}='val1.2';

kann ich den dann auch irgendwie so inin:
Code: (dl )
my %hash{'key1'}=('key1.1' => 'val1.1', 'key1.2' => 'val1.2');

?, damit die Sache schöner aussieht, kürzer is?
styx-cc
 2006-11-12 14:41
#71663 #71663
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Also die Art von Hashes die du da zeigst kenne ich nicht, aber du koenntest ein Hash aus Arrays bauen, dann laesst sich darauf auch recht einfach zugreifen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl -w
use strict;

my @chars = ("A".."Z");
my @nums = (0..9);

my %hash = (
nums => \@nums,
chars => \@chars
);

print $hash{'nums'}->[1];


MfG\n\n

<!--EDIT|styx-cc|1163335333-->
Pörl.
topeg
 2006-11-12 15:15
#71664 #71664
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Grundsätzlich ja, aber nicht so wie du es versuchst. Du brauchst dafür anonyme Hashes bzw. Referenzen auf Hashes.

Code: (dl )
my %hash=('key1' => 'val1', 'key2' => 'val2');

Das ist schon mal ein guter Anfang.
Nun kannst du daraus die Referzen ziehen:
Code: (dl )
my $hash_ref=\%hash;

oder gleich einen anonymen Hash erzeugen:
Code: (dl )
my $hash_ref={'key1' => 'val1', 'key2' => 'val2'}

das kannst du dann in einen anderen Hash packen:
Code: (dl )
my $hash2{'key_a'}=$hash_ref;

Oder das ganze in einem Durchgang:
Code: (dl )
$hash2{'key_a'}={'key1' => 'val1', 'key2' => 'val2'};

Man kann es auch noch weiter zusammenziehen:
Code: (dl )
1
2
3
4
5
%hash2=(
'key_a'=>{'key1' => 'val1', 'key2' => 'val2'},
'key_b'=>{'key3' => 'val3', 'key4' => 'val4'}
# ...
);
betterworld
 2006-11-12 15:19
#71665 #71665
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=pearl-man,12.11.2006, 13:30]
Code: (dl )
1
2
my $hash{'key1'}{'key1.1'}='val1.1';
$hash{'key1'}{'key1.2'}='val1.2';
[/quote]
Solche Konstrukte sind außerdem ein ziemlicher Syntaxfehler. Man muesste es so schreiben:
Code: (dl )
1
2
3
my %hash;
$hash{'key1'}{'key1.1'}='val1.1';
$hash{'key1'}{'key1.2'}='val1.2';
topeg
 2006-11-12 15:33
#71666 #71666
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
[quote=betterworld,12.11.2006, 14:19]
Code: (dl )
1
2
3
my %hash;
$hash{'key1'}{'key1.1'}='val1.1';
$hash{'key1'}{'key1.2'}='val1.2';
[/quote]
Wobei mir sowas auch nicht gerade gefällt, da man vorraussetzt, das der Schlüssel "key1" noch nicht verwendet wurde. Unter Umständen erzeugt das einen Fehler wenn schon ein Skalar oder Array da drin ist. Für besser halte ich das so, da man eventuelle Werte im Hasheintrag explizit überschreibt:
Code: (dl )
1
2
3
4
my %hash;
$hash{'key1'}={};
$hash{'key1'}{'key1.1'}='val1.1';
$hash{'key1'}{'key1.2'}='val1.2';
betterworld
 2006-11-12 18:37
#71667 #71667
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=topeg,12.11.2006, 14:33]
Code: (dl )
1
2
3
4
my %hash;
$hash{'key1'}={};
$hash{'key1'}{'key1.1'}='val1.1';
$hash{'key1'}{'key1.2'}='val1.2';
[/quote]

Dann hat man ja gar nichts mehr von der Autovivification ;-)

Da man %hash gerade erst definiert hat, sollte es solche Probleme nicht geben. Und wenn es %hash schon laenger gibt, kann es sein, dass auch in dem Hash %{$hash{key1}}. Die wuerdest Du ja nun vernichten.
Quote
...wenn schon ein Skalar oder Array da drin ist...

In dem Fall liegt aber meist auch irgendwo ein Fehler vor, weil dieser Speicher wahrscheinlich nicht fuer einen Skalar oder Array vorgesehen ist, sondern eben fuer einen Hash. Daher ist es doch ganz praktisch, wenn es einen fatalen Fehler gibt.\n\n

<!--EDIT|betterworld|1163349495-->
topeg
 2006-11-12 19:08
#71668 #71668
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Sicher, sicher, nur stehe ich auf dem Standpunkt, daß man sich doch eine gewisse Routine und Vorgehensweisen angewöhnen sollte, die Fehler vermeidet. Hatte schon einige sehr seltsame Fehler wegen solcher Sachen.
Z.B. beim laden von Configs, oder Abarbeitung von XML-Dokumenten.
pq
 2006-11-13 10:55
#71669 #71669
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=topeg,12.11.2006, 18:08]Sicher, sicher, nur stehe ich auf dem Standpunkt, daß man sich doch eine gewisse Routine und Vorgehensweisen angewöhnen sollte, die Fehler vermeidet.[/quote]
ja, aber wie betterworld schon sagte, wenn du an der stelle, an die du
einen hash schreiben willst, schon ein array existiert, liegt vermutlich ein
fehler vor, und mit deiner vorgehensweise *verdeckst* du den fehler,
anstatt ihn zu entdecken.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2006-11-13 14:54
#71670 #71670
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Genauso koennte man dann sagen: "Ich frage bei open nicht mehr den Rueckgabewert ab, weil ich Fehler vermeiden will." An der Stelle kann man den Fehler gar nicht mehr vermeiden, und sollte sich mehr dafuer interessieren, dass man den Fehler bemerkt.
topeg
 2006-11-13 20:59
#71671 #71671
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Jaja ist gut!
Ich werde es in meinem Leben nie wieder tun!
Code: (dl )
$hash{'key1'}={} and warn("Überschreibe \$hash{'key1'} mit einem Hash") if(exist($hash{'key1'}) and ref($hash{'key1'}) ne "HASH");

Ist das besser?!
:-)
<< >> 10 Einträge, 1 Seite



View all threads created 2006-11-12 14:30.