1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @n = ('n1','n2','n3');
my @z = ('z1','z2','z3');
my @w = (1,2,3);
my %h; # $h{Name}{Zeit} = Wert;
# hash-sclice für Name n0 und Zeiten z1-z3:
@{$h{n0}}{@z} = @w;
print Dumper(\%h),"\n";
# hash-sclice für Namen n1-n3 und Zeit z0:
%h = ();
$h{$n[$_]}{z0} = $w[$_] for (0..$#w);
print Dumper(\%h),"\n";
2015-07-02T14:17:33 mmrweIch verwende einen Hash of Hashes mit Namen als 1. und Zeitstempel als 2. Schlüssel.
Einem Namen (n0) kann ich mit einem Slice mehrere Werte (1,2,3) für mehrere Zeitstempel (z1,z2,z3) in einem Rutsch zuweisen.
Wenn ich aber mehreren Namen (n1,n2,n3) zu einem Zeitstempel (t0) mehrere Werte zuweisen möchte, fällt mir nur eine for-Schleife ein.
Ginge das auch direkt mit einem Slice?
QuoteEine weitere Frage:
Wie kann ich auf einfache Weise feststellen, ob der Hash leer ist oder Werte enthält, d.h. mindestens einen Namen mit mindestens einem Zeitstempel mit Wert?
QuoteMuß man jeden Namen einzeln prüfen, ob der dahinter referenzierte Hash ein Wertepaar hat? Wenn ich einen HoH mit delete verkleinere, bleiben ggf. Referenzen auf leere Hashes übrig und der HauptHash %h ist nicht leer, hat aber keine Werte mehr.
1
2
3
4
5
6
7
8
9
%h = (); # Hash ist leer
print Dumper(\%h),"\n";
(%h) ? print "Hash ist nicht leer\n" : print "Hash ist leer\n";
$h{n0}{t0} = 1; # Hash ist nicht leer, hat eine Zahl gespeichert
print Dumper(\%h),"\n";
(%h) ? print "Hash ist nicht leer\n" : print "Hash ist leer\n";
delete($h{n0}{t0}); # Hash ist nicht leer, aber keine Zahl mehr da
print Dumper(\%h),"\n";
(%h) ? print "Hash ist nicht leer\n" : print "Hash ist leer\n";