hash of hashes

hash of hashes

am 10.06.2006 13:18:34 von Chris Maanz

Guten Tag!

Nachdem ich die Hash of Hashes nicht verstanden habe, dachte ich,
anhand eines Beispiels komme ich drauf.
Allerdings verwirrt mich das noch mehr.
Eigentlich war die Idee ein Script zu schreiben, dass aus einer Log-Datei
die User ausliest und die gesendeten und empfangenen Bytes für jeden User
in einem Hash speichert.
Allerdings kamen dann in der Anzeige so merkwüdige User mit dem Namen
HASH(0x81713b4).
Also probierte ich es mit einem reduzierten Testscript, dem ich beim Aufruf
einen Usernamen und
2 Werte mitgebe. Aber auch hier taucht wieder dieser HASH auf.
Wie lese ich einen Hash-Of-Hash in einer Schleife aus, ohne diesen HASH zu
sehen (außer ihn
auf unelegante Weise mit if (index ($string, "HASH") >0 ) einfach nicht
anzuzeigen?

Testscript:
#!/usr/bin/perl

$user=shift;
$in_bytes=shift;
$out_bytes=shift;

$userbytes{$user}->{'summe_in'} = $in_bytes;
$userbytes{$user}->{'summe_out'} = $out_bytes;

foreach $schluessel(%userbytes) {
print "User $schluessel\n";
print $userbytes{$schluessel}->{'summe_in'};
print "\n";
print $userbytes{$schluessel}->{'summe_out'};
print "\n";
}

Testlauf:
christian@lin1:~/Perl_Scripts/test> ./eingabe wm2006 4711 0815
User wm2006
4711
0815
User HASH(0x81713b4)


christian@lin1:~/Perl_Scripts/test>

Re: hash of hashes

am 10.06.2006 13:45:19 von Christian Winter

Chris Maanz schrieb:
> Guten Tag!
>
> Nachdem ich die Hash of Hashes nicht verstanden habe, dachte ich,
> anhand eines Beispiels komme ich drauf.
> Allerdings verwirrt mich das noch mehr.
> Eigentlich war die Idee ein Script zu schreiben, dass aus einer Log-Datei
> die User ausliest und die gesendeten und empfangenen Bytes für jeden User
> in einem Hash speichert.
> Allerdings kamen dann in der Anzeige so merkwüdige User mit dem Namen
> HASH(0x81713b4).
> Also probierte ich es mit einem reduzierten Testscript, dem ich beim Aufruf
> einen Usernamen und
> 2 Werte mitgebe. Aber auch hier taucht wieder dieser HASH auf.
> Wie lese ich einen Hash-Of-Hash in einer Schleife aus, ohne diesen HASH zu
> sehen (außer ihn
> auf unelegante Weise mit if (index ($string, "HASH") >0 ) einfach nicht
> anzuzeigen?
>
> Testscript:
> #!/usr/bin/perl
>
> $user=shift;
> $in_bytes=shift;
> $out_bytes=shift;
>
> $userbytes{$user}->{'summe_in'} = $in_bytes;
> $userbytes{$user}->{'summe_out'} = $out_bytes;
>
> foreach $schluessel(%userbytes) {

Hi,

hier liegt der Casus Knaxus. foreach( HASH ) behandelt den
Hash wie eine Liste aus Schlüsseln und Werten, d.h. für einen
Hash mit $hash{'key'} = 'value' würde das dann von Perl interpretiert
als foreach( 'key', 'value' ).

Du möchtest lieber
foreach my $schluessel( keys %userbytes )
schreiben.

Als Lektüre dazu empfehle ich "perldoc perlreftut" und "perldoc perlref"
sowie "perldoc perldata".

Viele Grüße
-Christian

Re: hash of hashes

am 10.06.2006 19:49:44 von Mirco Wahab

Thus spoke Chris Maanz (on 2006-06-10 13:18):

> foreach $schluessel(%userbytes) {
> print "User $schluessel\n";

Zusätzlich zu Christians Lösung mit dem
foreach $schluessel( keys %userbytes) {
...
kannst Du auch den 'each'-Iterator benutzen:

...
my ($user, $in_bytes, $out_bytes) = (shift, shift, shift);
my (%userbytes, $schluessel, $wert);

$userbytes{$user}->{summe_in} = $in_bytes;
$userbytes{$user}->{summe_out} = $out_bytes;

while( ($schluessel, $wert) = each %userbytes ) {
print "User $schluessel\n",
$wert->{summe_in}, "\n",
$wert->{summe_out}, "\n";
}
...


%> perldoc -f each

Viele Grüße

Mirco