Thread Hashkey nach Spalten sortiert ausgeben (15 answers)
Opened by bloonix at 2006-05-05 17:58

bloonix
 2006-05-05 17:58
#65588 #65588
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo zusammen,

folgendes Problem habe ich...

Ich habe einen Hash mit Daten, die in eine Datei Spaltenweise
geschrieben werden müssen. Die Spaltenpositionen der
einzelnen Keys sind in einem anderen Hash abgelegt.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);

# Das ist der Hash mit den Daten, die irgendwo generiert werden
my $stats = {
  ProcStats => {
     Total  => 0,
     New    => 0,
     System => 0,
     IOWait => 8.00,
     User   => 0,
     Idle   => 92.00,
     Nice   => 0,
  },
  MemStats => {
     Cached      => 531976,
     SwapUsed    => 276600,
     MemTotal    => 1035296,
     SwapUsedPer => 26.09,
     Buffers     => 188256,
     MemUsed     => 981812,
     SwapTotal   => 1060248,
     MemFree     => 53484,
     SwapFree    => 783648,
     MemUsedPer  => 94.83,
  },
  TimeStamp => {
     Time => '15:05:08',
     Date => '2006-05-05',
  },
};

# Das ist der Hash mit den Spaltenpositionen der einzelnen
# Keys. Die Positionen werden aus einer Konfigurationsdatei
# geladen... zum Test habe ich beide Hashs einfach mal so
# hierhin geschrieben...
my $defines = {
  ProcStats => {
     User   => 1,
     Nice   => 2,
     System => 3,
     Idle   => 3,
     IOWait => 4,
     Total  => 5,
     New    => 6,
  },
  MemStats => {
     MemUsed     => 1,
     MemFree     => 2,
     MemUsedPer  => 3,
     MemTotal    => 4,
     Buffers     => 5,
     Cached      => 6,
     SwapUsed    => 7,
     SwapFree    => 8,
     SwapUsedPer => 9,
     SwapTotal   => 10,
  },
};

# Zunächst erzeuge ich das Datenverzeichnis...
my $datadir = $stats->{TimeStamp}->{Date};
unless (-e $datadir) {
  mkdir($datadir) or die $!;
}

# Nun durchlaufe ich den Datenhash und schreibe die Daten
# Spaltenweise weg.
foreach my $alias (keys %$stats) {
  next if $alias eq 'TimeStamp';
  my $file = "$datadir/$alias";
  my $data = $stats->{$alias};

  # ** und genau diese Stelle hier sagt mir überhaupt nicht zu...
  my @tmp_arr = ($stats->{TimeStamp}->{Time});
  $tmp_arr[$defines->{$alias}->{$_}] = $data->{$_} for keys %{$defines->{$alias}};

  sysopen my $fh,$file,O_WRONLY | O_APPEND | O_CREAT,0644 or die $!;
  flock($fh,LOCK_EX);
  print $fh join ' ', @tmp_arr;
  print $fh "\n";
  close $fh;
}


** Ich finde es irgendwie super umständlich, die Positionen
der einzelnen Keys auf diese Weise zu ermitteln.

Wie könnte ich das besser lösen? Oder ist diese Lösung ganz
ok? Ich bin mir sehr unsicher. Sollte ich vielleicht mit printf
arbeiten und den Spalten eine feste Länge geben? Nur dann
müsste ich dauernd mit seek zu der Spaltenposition springen,
an welche die Daten geschrieben werden sollen.

Der Aufbau der Konfigurationsdatei ist in der Art:
(noch etwas komplizierter, da es mehrere Ebenen gibt, hier vereinfacht)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[ProcStats]
User = 1
Nice = 2
System = 3
Idle = 3
IOWait = 4
Total = 5
New = 6

[MemStats]
MemUsed = 1
MemFree = 2
MemUsedPer = 3
MemTotal = 4
Buffers = 5
Cached = 6
SwapUsed = 7
SwapFree = 8
SwapUsedPer = 9
SwapTotal = 10


Greez,
opi\n\n

<!--EDIT|opi|1146837707-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.

View full thread Hashkey nach Spalten sortiert ausgeben