Thread Programmierungshilfe für PERL
(9 answers)
Opened by asakalli at 2010-07-16 13:32
Nur damit ich es richtig verstanden habe.
Du hast in einem/mehreren Verzeichnissen Dateien die Zeilen dieser Art haben: 07/17/2010 02:15:46| main|node105|W|job 56494 exceeds job hard limit "h_vmem" of queue sobald eine Solche Zeile auftaucht soll die JobNummer und NodeNummer zwischen gespeichert werden, um sie später weiter zu verarbeiten. Dazu ein Paar Bemerkungen: Ich nehme mal an, nicht jede "Node" macht eine Meldung zu einem Job, aber es kann sein, das zu einer Node mehrere Jobs Meldungen machen. Wenn dem so ist ist deine Form der Speicherung sehr ineffizient. Wenn du ein Array benutzt in der Jede Node-ID ein Eintrag sein kann hast du unter Umständen sehr viele Leere Felder im Array, das ist reine Speicherverschwendung. Besser ist hier ein Hash zu benutzen. Wenn meine Vermutungen Stimmen und es mehrere Job-Meldungen zu einer Node geben kann, solltest du die Job-IDs in einem Array oder Hash speichern. Wenn ein Job sich mehrfach Melden kann Wird die Struktur noch etwas komplizierter. Ich denke Du willst auch wissen was passiert ist. Die Meldung kannst du auch gleich mit übernehmen. Ich würde es so anfangen: Code (perl): (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 #!/usr/bin/perl use strict; use warnings; # das Modul Data::Dumper laden # exportiert die Funktion "Dumper" use Data::Dumper; # Verzeichnis in dem gesucht werden soll my $dir='/ver1/ver2/ver3/'; # Jobs zu den Nodes in einem Hash speichern my %node; # alle Dateien im Verzeihnis durch gehen for my $file (glob("$dir*")) { # Datei öffnen und prüfen ob es funktioniert hat if(open(my $fh, '<', $file)) { # Datei Zeilenweise durch gehen while(my $line=<$fh>) { chomp($line); ## Wenn eine Zeile "node" mit einer Nummer und Job mit einer Nummer zusammen mit "exeeds" auftaucht, ## Dann die NodeID und JobID zusammen mit der Meldung speichern. #$node{$1}{$2}=$3 if($line=~/node(\d+).*?job (\d+) exceeds (.+)$/); # das kann man auch anders schreiben: if(index('exceed',$line)>-1) { # zeile an den "|" spliten my @col=split('|', $line); # nodeid ermitteln my ($nodeid)=$col[2]=~/(\d+)/; # jobid ermitteln my ($jobid)=$col[4]=~/job\s*(\d+)/; # message ermitteln my ($message)=$col[4]=~/exceeds (.+)$/; # alles zusammen speichern $node{$nodeid}{$jobid}=$message; } } # Datei schließen close($fh); } else { # waren wenn das Öffnen der Datei fehlschlug warn("ERROR open $file ($!)\n"); } } # Mit Dumper kann man Datenstrukturen formatiert ausgeben lassen. # das ist ganz nützlich um zu sehen was man überhaupt an Daten hat. print Dumper(\%node); Der Code sollte machen was du dir wünschst. Was deinen Code und das "for" betrifft. Das ist unsinnig. Du durchläufst immer wider den selben Code Öffnest die selben Dateien filterst sie auf die selbe Weise und übernimmst immer die selben Werte. Du bekommst also 100 mal das selbe. |