Schrift
[thread]7944[/thread]

Hashkey nach Spalten sortiert ausgeben



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
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.
bloonix
 2006-05-05 18:54
#65589 #65589
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe mir auch noch etwas anderes überlegt...
Mein Anzatz beginnt beim Auslesen der Konfig-Datei...

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
# ganz simples Auslesen...
my $defines = {};
open DEF,'<','./defines.cfg' or die $!;
my $sect;
while (<DEF>) {
  if (/^\[(\w+)\]/) {
     $sect = $1;
  } elsif (/^(\w+)\s=\s(\d+)$/) {
# ich erzeuge sofort ein Array mit der Reihenfolge der Keys
     $defines->{$sect}->[$2] = $1;
  }
}
close DEF;

my $datadir = "$stats->{TimeStamp}->{Date}";
unless (-e $datadir) {
 mkdir($datadir) or die $!;
}

foreach my $alias (keys %$stats) {
 next if $alias eq 'TimeStamp';
 my $file = "$datadir/$alias";
 my $data = $stats->{$alias};

  sysopen my $fh,$file,O_WRONLY | O_APPEND | O_CREAT,0644 or die $!;
 flock($fh,LOCK_EX);

 print $fh $stats->{TimeStamp}->{Time};
 foreach my $key (@{$defines->{$alias}}) {
# if $key, weil die ersten Elemente leer sein können
print $fh " $data->{$key}" if $key;
 }
  print $fh "\n";

  close $fh;
}


Datenhash und Konfig sind im ersten Thread zu sehen...\n\n

<!--EDIT|opi|1146841042-->
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.
Ronnie
 2006-05-05 20:13
#65590 #65590
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
snipp - sorry, war einfach an der Fragestellung vorbei ...\n\n

<!--EDIT|Ronnie|1146848882-->
bloonix
 2006-05-05 20:31
#65591 #65591
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ronnie,05.05.2006, 18:13]Als sinnvoller würde ich aber die Verwendung eines der cpan Module empfehlen, z.B. CPAN:YAML usw.[/quote]
Halli hallo Ronnie,

letztendlich werde ich MySQL und DBI verwenden :)

Aber bis dahin möchte ich es gerne ohne ausprobieren und mich
damit auseinandersetzen ... es macht mir im Moment wieder
richtig Spaß.

Wie würdest du es denn ohne Modul machen?

Viele Grüße,
opi
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.
Ronnie
 2006-05-05 20:40
#65592 #65592
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
snipp - muss nochmal alles lesen, war auf 'nem falschen Dampfer ...\n\n

<!--EDIT|Ronnie|1146848741-->
pq
 2006-05-05 21:07
#65593 #65593
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,05.05.2006, 16:54]Ich habe mir auch noch etwas anderes überlegt...
Mein Anzatz beginnt beim Auslesen der Konfig-Datei...[/quote]
du bist schon der zweite innerhalb kurzer zeit, der mir begegnet, der lieber selber einen config-parser schreibt als Config::IniFiles o.ä. zu benutzen. wieso?
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
bloonix
 2006-05-05 21:16
#65594 #65594
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,05.05.2006, 19:07]du bist schon der zweite innerhalb kurzer zeit, der mir begegnet, der lieber selber einen config-parser schreibt als Config::IniFiles o.ä. zu benutzen. wieso?[/quote]
hi pq, weil es mein hobby ist. die einen haben ne modeleisenbahn im
keller, wieder andere werken mit holz herum... ja und ich bastel gerne
mit perl. das ist meine freizeit und ich habe meinen spaß daran.

ist daran irgendetwas falsch? =)

beruflich nutze ich grundsätzlich module, aber in meiner freizeit und just
for fun ist das doch unerheblich. oder was meinst du dazu? :)

Edit:

nun könnte man einwerfen, dass ich mir die module einfach anschaue
und dann sehe, wie es gemacht wird... aber ein modeleisenbahnfreak
steht auch nicht den ganzen tag am schaufenster... er will selber basteln =)

das ist ein missverständnis in sehr vielen foren, in denen immer wieder
auf module und fertige dinge verwiesen wird. aber der autor eines
threads will es vielleicht auch mal ohne modul hinbekommen, weil er
wissbegierig ist und es ihm einfach spaß macht. ich finde, das ist echt
ok.

danke übrigend für die folien... bin schon fleißig am lesen... in meiner
freizeit...\n\n

<!--EDIT|opi|1146850180-->
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.
bloonix
 2006-05-05 21:27
#65595 #65595
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ronnie,05.05.2006, 18:13]snipp - sorry, war einfach an der Fragestellung vorbei ...[/quote]
hey, wo ist dein code? hast ihn einfach wieder geklaut? her damit :)

der war zwar an meiner frage vorbei, aber deine import methode war
ganz interessant...
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.
Ronnie
 2006-05-05 21:42
#65596 #65596
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Sorry, hier nochmal etwas was eher dein Bedürfnis abdecken dürfte. Das ganze ist stark vereinfacht, aber die Idee ist das das jeweilige Objekt ein Attribut Position bekommt. Du brauchst natürlich statt generischer Stat-Objekte, ProcStats- und MemStats- Objekte, die wiederum aus einfacheren Objekten bestehen können, die ebenfalls ein Positions-Attribut bekommen (und evtl. viele andere).
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

package Stat;
use Moose;

has 'val' => (isa => 'HashRef', is => 'rw');
has 'position' => (is => 'rw');

sub add_kv {
my $self = shift;
my %to_add = @_;
my ($k, $v);
$self->{val}->{$k} = $v while (($k, $v) = each %to_add);
}

sub to_s {
my $self = shift;
my ($k, $v, $s);
$s .= $k . "\t" . $v . "\n" while (($k, $v) = each %{$self->{val}});
return $s;
}

package StatSet;
use Moose;

has 'stats' => (isa => 'ArrayRef', is => 'rw');

sub add_stat {
my $self = shift;
my $stat = shift;
push @{$self->{stats}}, $stat if $stat;
}

sub report {
my $self = shift;
my $s;
$s .= $_->to_s . "\n" for (sort { $a->position <=> $b->position } @{$self->stats});
return $s;
}

package main;

my $set = new StatSet;
my $stat1 = new Stat;
my $stat2 = new Stat;

$stat1->add_kv( color => 'green', size => 'huge' );
$stat1->add_kv( amount => 'some' );
$stat1->position(1);

$stat2->add_kv( color => 'blue', size => 'large', amount => 'many' );
$stat2->position(2);

$set->add_stat($stat1);
$set->add_stat($stat2);

print $set->report;
\n\n

<!--EDIT|Ronnie|1146851611-->
pq
 2006-05-06 06:32
#65597 #65597
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,05.05.2006, 19:16]ist daran irgendetwas falsch? =)[/quote]
war nur ne frage =)
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
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-05-05 17:58.