PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler beim zusammenführen von Strings


Pharao
20.09.2004, 16:56
Hi
das ist mein log.pl - Testfile, dass ausgewertet wird.
warn an warning occured
error an error occured
hier gibts nix
alles ok
ok hier auch
nana

Das ist mein Quellcode
#!/usr/bin/perl

#Tags 2 Highlight
@warntags = ('warn', 'error');
@okaytags = ('ok');

#colors...
$red = "<span class=\"red\">";
$blue = "<span class=\"blue\">";
$closespan ="</span>";

#Output
@tagoutput; #Outputarray
$linecount="0"; #Outputentry

#Template: Top of the HTML-File
my $toptemp = <<HERE_TOPTEMP;
<html>
<head>
<title>LogBock-Analyse</title>
</head>
<body>
HERE_TOPTEMP

#Template: Bottom of the HTML-File
my $bottemp = <<HERE_BOTTEMP;
</body>
</html>
HERE_BOTTEMP


my $logfile = "log.pl";
open(LOG, "< $logfile");

#Mainpart: file parsen
while (my $line = <LOG>)
{
#split file at new line
chomp ($line);
@LinesOfLog = (split("\n", $line));


#check every line in logfile
foreach $logentry (@LinesOfLog)
{
#check log for warntags
foreach $tagentry (@warntags)
{
$found = grep /$tagentry/, $logentry;

#if warntag is found -> do
if($found == 1)
{
$tagoutput[$linecount] = $red . $found . $closespan . "<br>\n";
}
}

#check log for okaytags
foreach $tagentry (@okaytags)
{
$found = grep /$tagentry/, $logentry;

#if okaytag is found -> do
if($found == 1)
{
$tagoutput[$linecount] = $blue . $found . $closespan . "<br>\n";
}
}

#if no tag is found -> do defaultaction
if($found != 1)
{
$tagoutput[$linecount] = $logentry . "<br>\n";
}

#Increase HTMLlines
$linecount += 1;
}
}

for ($i = 0; $i < @tagoutput; $i++)
{
print $tagoutput[$i] . "\n";
}

Und das ist die Ausgabe auf dem Terminal
[blitz@GoldSpirit blitz]$ perl LogBock.pl
warn an warning occured<br>

error an error occured<br>

hier gibts nix<br>

<span class="blue">1</span><br>

<span class="blue">1</span><br>

nana<br>


Leider kann ich mir nicht erklären, wo der Fehler beim zusammenführen der Strings liegt.
Die Aufrufe sind ja genau gleich, aber einmal wird "span" ignoriert und einmal wird $found
verfälscht.
Findet jemand beim überfliegen das Problem?
gruß
Pharao


Jan Krüger
20.09.2004, 18:18
Ich kann gerade nicht nachvollziehen, wo du ein "span" vermisst, aber das mit dem $found kann ich dir erklären: grep operiert nur auf Arrays (und liefert solche zurück).

Pharao
20.09.2004, 21:06
Die ersten beiden Zeilen sollten mit "<span class=\"red\">"; $bla </span> makiert sein, da
ein Wort aus $warntags vorkommt.
Bei $okaytags macht es es ja genau richtig, nur dass er nicht den Text zwischen
<span></span> schreibt sondern 1.

$warntags wird richtig verglichen, daran, dass der Vergleich nicht geht liegt es also nicht.
Zumindest gibt es print "1"; zurück, wenn das anstatt der Zuweißung schreibe.

und tagoutput ist ja eigentlich als Array angegeben... um dann auf ein Element zuzugreifen
muss ich ja anstatt ein @ ein $ davorsetzen oder sehe ich das falsch?
Steht zumindest so im Buch in dem ich extra nochmal nachgeschlagen habe.

butterkeks
20.09.2004, 22:23
Jan meint, dass du nicht einfach $found einfügen kannst, da $found eine Zahl ist (in skalarem Kontext liefert grep ja die Anzahl der im zurückgegeben Array enthaltenen Werte zurück). Du kannst entweder $found als array deklarieren, oder den Rückgabewert von grep mit join in einen String umwandeln (oder oder oder...).

Eine Sache am Rande, die ich net verstehe:
Warum splittest du die eingelesene Zeile anhand newlines? Du liest doch sowieso alles zeilenweise ein, oder?

Pharao
20.09.2004, 22:49
>Jan meint, dass du nicht einfach $found einfügen kannst, da $found eine
>Zahl ist (in skalarem Kontext liefert grep ja die Anzahl der im
>zurückgegeben Array enthaltenen Werte zurück).
das hört sich logisch an :)

>Du kannst entweder $found als array deklarieren, oder den Rückgabewert
>von grep mit join in einen String umwandeln (oder oder oder...).
Ich werde mir morgen mal durch den Kopf gehen lassen was am einfachsten
ist.

>Warum splittest du die eingelesene Zeile anhand newlines? Du liest
>doch sowieso alles zeilenweise ein, oder?
Der Quelltext hat sich im Laufe der Woche extrem verändert. Und das
war der erste Ansatz den ich gefunden habe, das sauber durchlaufen
zu lassen. Ich habe mir also noch keine Gedanken gemacht was wirklich
nötig ist und wie ich mir noch besser in den Fuss schießen kann...
Um das öffnen habe ich mich noch garnicht gekümmert, ich habe einfach
ein Quelltext den ich vor Monaten geschrieben habe eingebastelt.
Damals habe ich per Tabulator getrennte Daten ausgewertet.
-> Einfach \t durch \n ersetzt.