Ronnies Vorschlag finde ich klasse. Vor allem ist es nett, die Markierung mit CSS vorzunehmen. Leider braucht man noch HTML::Template, was nicht zur Standardausruestung gehoert. Und ein Anfaenger wird sicherlich etwas laenger dafuer brauchen, die map()-Konstruktion zu verstehen. ;)
Ich habe hier mal versucht, das Originalskript von blackbit nachzuprogrammieren, mit nur wenigen prinzipiellen Aenderungen. Anders geloest ist eigentlich nur das Nachschlagen der Beschreibungen, die hier einmalig in einen Hash geladen werden. Leider hat blackbit nicht gesagt, wie gross die ip.desc ist, denn wenn diese zu gross ist, verbraucht diese Loesung zu viel Speicherplatz.
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
#!/usr/bin/perl
# Die folgenden beiden Zeilen sollten *immer* in einem Perl-Programm
# stehen, zumindest waehrend Entwicklung und Test. Damit wird man daran
# gehindert, unsichere Konstruktionen zu benutzen ('strict') und vor
# einigen moeglichen Fehlerquellen gewarnt ('warnings').
use strict;
use warnings;
htmlhead('IP Tabelle');
tablehead();
file2table('ip', '1');
tablefoot();
htmlfoot();
exit 0; # Programmende
########################################
# Hier kommen die Unterroutinen
########################################
sub htmlhead {
# Die Uebergabeparameter befinden sich im Array @_,
# das erste Element ist also $_[0]
print "<html>\n<title>$_[0]</title>\n<body>\n";
}
sub htmlfoot {
print "</body></html>\n";
}
sub file2table {
my ($file, $highlight) = @_;
# Alle Beschreibungen in den Hash %desc einlesen
my %desc;
open (DESC, '<', "$file.desc") or die "kann $file.desc nicht oeffnen: $!";
while (<DESC>) { # jede Zeile landet im Default-Parameter $_
chomp(); # Zeilenumbruch am Zeilenende entfernen
# teile am ersten Whitespace in 2 Teile
my ($h, $d) = split ' ', $_, 2;
# Schluessel ist der Host, Wert die Beschreibung
$desc{$h} = $d;
}
close DESC;
# IPs einlesen
open (RAW, '<', "$file.raw") or die "kann $file.raw nicht oeffnen: $!";
while (<RAW>) { # auch hier jede Zeile einzeln in $_
# automatisch an Whitespace teilen (alles hinter
# dem zweiten Whitespace wird ignoriert!)
my ($host, $ip) = split;
print '<tr>';
my ($ba, $be) = ('', '');
# wenn $highlight irgendwo in $host auftaucht, $ba und $be setzen.
# $highlight zaehlt dabei - wie bei grep - als Regex-Muster!
if ($host =~ /$highlight/) {
$ba = '<b>'; $be = '</b>';
}
# Zeile fuer Host ausgeben, evtl mit Beschreibung,
# wenn sie im Hash existiert, ansonsten mit festem Leerzeichen
print "<td>$ba$host$be</td><td>$ba$ip$be</td><td>$ba",
(exists $desc{$host} ? $desc{$host} : ' '),
"$be</td>";
print "</tr>\n";
}
close RAW;
}
sub tablehead {
print "<table>\n";
}
sub tablefoot {
print "</table>\n";
}
Edit: Fehlendes <td> ergaenzt, chomp() eingebaut, kaputtes perl-Tag durch code-Tag ersetzt, damit "\n" und " " wieder richtig zu sehen sind. *grmpf*\n\n
<!--EDIT|Dubu|1107094097-->