Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7958[/thread]

Tiefe Hash Strukturen aus Config bilden: Und warum while(<FH>) gefährlich ist

Leser: 1


<< |< 1 2 3 4 ... 7 >| >> 63 Einträge, 7 Seiten
bloonix
 2006-05-09 17:07
#65807 #65807
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo,

beim Auslesen eine Konfig-Datei möchte ich tiefere Hash-
Strukturen bilden. Nun habe ich mir eine Funktion geschrieben,
die funktioniert, aber bestimmt gibt es so einiges an der
Syntax zu bemängeln.

Die Konfig-Datei schaut also wie folgt aus...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
Default-Monitor = yes
Default-Description = Datawarehouse Server
Default-OS-Name = SuSE Linux Enterprise Server
Default-OS-Release = 2.6.4
Default-Service = 43610
Default-Mail-Group = dba
Threshold-ProcStats-Total = 95
Threshold-ProcStats-New = 200
Threshold-MemStats-SwapUsedPer = 50
Threshold-PgSwStats-SwapOut = 1
Threshold-LoadAVG-RunQueue = 20


Die Funktion ...
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
sub read_config {
  my $file = shift;
  my $conf = {};
  my $line = 0;

  sysopen my $fh, $file, O_RDONLY or die "cannot open $file - $!";
  flock($fh,LOCK_SH);

  while (<$fh>) {
     $line++;
     next if /^\s*(#|$)/;

     chomp;
     s/\s*#.*$//;

     unless (/^\s*([a-zA-Z0-9-]+)\s*=\s*(.*)$/) {
        warn "errors in config file $file line $line detected";
        next;
     }

     my ($name,$value) = ($1,$2);

     # Verarbeitung des Parameters
     my @keys = split /-/, $name; # Parameter nach Keys splitten
     my $last = pop @keys;        # den letzten Key festhalten
     my $href = $conf;            # temporaere Referenz

     for (@keys) {
        $href->{$_} = {} unless exists $href->{$_};
        $href = $href->{$_};
     }

     $href->{$last} = $value;
  }

  close $fh;
  return $conf;
}


Viele Grüße,
opi\n\n

<!--EDIT|opi|1147180909-->
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.
bo
 2006-05-09 17:37
#65808 #65808
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
Schau Dir mal das Modul XML::Simple an. Damit kannst Du solche Strukturen ganz einfach schreiben und lesen.
Ronnie
 2006-05-09 17:37
#65809 #65809
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Spar dir viel Arbeit und nimm einfach CPAN:YAML.
Deine Config könnte dann so aussehen und wäre automatisch beim laden ein 'tiefer' Hash. Eine andere Methode hatte ich ja schon in einem früheren Thread aufgezeigt.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Default:
Description: Datawarehouse Server
Mail:
Group: dba
Monitor: yes
OS:
Name: SuSE Linux Enterprise Server
Release: 2.6.4
Service: 43610
Threshold:
LoadAvg:
RunQueue: 20
MemStats:
SwapUsedPer: 50
PgSwStats:
SwapOut: 1
ProcStats:
New: 200
Total: 95
bloonix
 2006-05-09 18:10
#65810 #65810
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
hi, wie würdet ihr das ohne modul machen? :)\n\n

<!--EDIT|opi|1147183854-->
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.
renee
 2006-05-09 18:21
#65811 #65811
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum willst Du es Dir unnötig schwer machen und auf Module verzichten??

Du müsstest das Array rückwärts durchlaufen und immer eine Hashreferenz weitergeben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2006-05-09 20:11
#65812 #65812
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,09.05.2006, 16:21]Warum willst Du es Dir unnötig schwer machen und auf Module verzichten??[/quote]
oh  je, es ist wirklich schwer, einfach mal verbesserungs-
vorschläge zur syntax zu bekommen...

ich erinnere mich noch an meinen ersten großen thread hier über
mein modul... da hat jeder verbesserungsvorschläge gemacht zur
syntax und noch mehr. tipps wurden mir gegeben... da hat
keiner geschrieben, dass ich doch bitte

Linux::Stat;
Linux::Cpuinfo;
Linux::*

nutzen soll, als das rad neu zu erfinden.

ausser verweise auf doku's und module ist wohl nicht mehr drin.

mich interessiert, wie man es ohne modul macht.
mich interessiert die meinung anderer programmierer,
wie sie es ohne modul realisieren würden.

erhält man hier nur tipps und anregungen, wenn es kein modul
dafür gibt?\n\n

<!--EDIT|opi|1147249600-->
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.
betterworld
 2006-05-10 01:45
#65813 #65813
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
opi: Benutz lieber nicht while(<$fh>){}, denn das hinterlaesst $_ immer unsauber.
murphy
 2006-05-10 04:30
#65814 #65814
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@opi: Ich finde den Code prinzipiell völlig in Ordnung, aber ich würde es rein geschmacklich vorziehen, nicht für jeden Konfigurationsschlüssel den vollen "Pfad" in den verschachtelten Hash angeben zu müssen. So etwas ähnliches wie die YAML-Syntax für Hashes fände ich hübscher.

Außerdem bin ich auch der Meinung, dass es für einfach strukturierte Konfigurationsdateien recht unnötig ist, ein Nicht-Standardmodul zu verwenden.
When C++ is your hammer, every problem looks like your thumb.
bloonix
 2006-05-10 12:11
#65815 #65815
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=betterworld,09.05.2006, 23:45]opi: Benutz lieber nicht while(<$fh>){}, denn das hinterlaesst $_ immer unsauber.[/quote]
du meinst, dass es besser ist while(my $zeile = <$fh>) {} zu verwenden?

klingt verständlich. wie meinst du das denn genau mit unsauber?

Code: (dl )
1
2
3
4
5
for (1,2,3) { }

s//test/;

print "$_\n";


nach der for-schleife ist $_ leer
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.
Relais
 2006-05-10 12:24
#65816 #65816
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=betterworld,09.05.2006, 23:45]opi: Benutz lieber nicht while(<$fh>){}, denn das hinterlaesst $_ immer unsauber.[/quote]
magst Du erklären, was Du damit meinst?
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
<< |< 1 2 3 4 ... 7 >| >> 63 Einträge, 7 Seiten



View all threads created 2006-05-09 17:07.