Seltsamer Effekt bei substr()
Cheatah
- perl
0 Jörk Behrends0 Cheatah
Hi,
erst mal ein wenig Vorgeschichte:
Ich schreibe gerade so eine Art Minibrowser, der eine Internet-Ressource auf verschiedene Arten darstellen kann. Dazu gehört auch, daß der Quelltext einer HTML-Seite als Text dargestellt wird, Links u.ä. aber auch als solche erscheinen (natürlich verändert, damit wieder das Script zur Ausgabe benutzt wird). Dabei sind mir zwei Dinge aufgefallen:
Erstens ist die Datei http://www.teamone.de/selfhtml/wselfhtm.css vom Type "application/x-pointplus" ;-))) und wird daher von meinem Script wie Binärdaten als Hexdump ausgegeben.
Zweitens lautet ein Teil dieser Ausgabe wie folgt:
[...]
5088 6E 64 65 72 62 61 72 20 2A 2F 0A 0A 61 2E 61 6E nderbar */..a.an
5104 20 7B 20 74 65 78 74 2D 64 65 63 6F 72 61 74 69 { text-decorati
5120 6F 6E 3A 6E 6F 6E 65 3B 20 7D 0A 0A 0A 0A 0A 2F on:nsubstr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
one; }...../
5136 2A 20 57 65 6E 6E 20 53 69 65 20 73 69 63 68 20 * Wenn Sie sich
5152 6D 69 74 20 53 74 79 6C 65 2D 53 68 65 65 74 73 mit Style-Sheets
[...]
Wenn man genauer hinguckt merkt man, daß der Text "text-decoration:n[...]one;" verlustfrei unterbrochen wird. Die Fehlermeldung, die übrigens an verschiedenen Stellen in verschiedener Anzahl auftaucht, immer jedoch n mal in Zeile 87 und n mal in Zeile 89, kann ich zwar übersetzen, aber ich verstehe sie nicht. Sie wird in folgender Routine erzeugt:
sub hexdump {
$z = length(length($_[0]));
print "<nobr><pre>\n";
print "Datei: $url\n";
print "Länge: ".length($_[0])." Bytes\n\n";
for ($i=0; $i<length($_[0]); $i+=16) {
print substr($i." ",0,$z)." ";
for ($j=$i; $j<=$i+15; $j++) { print &dez2hex(substr($_[0],$j,1))." "; }
print " ";
for ($j=$i; $j<=$i+15; $j++) { print &chrprint(substr($_[0],$j,1)); }
print "\n";
}
print "</pre></nobr>\n";
}
Die Routine wurde mit dem Inhalt der Datei aufgerufen ($z enthält die Zahl der Ziffern, die maximal als Position ausgegeben werden können), die beiden Routinen dez2hex und chrprint sind kaum für den Fehler verantwortlich zu machen - zumal sie grundverschieden sind, der Fehler aber gleichmäßig auftritt. Zeile 87 und 89 sind übrigens die beiden "print &...(substr..."-Zeilen.
Diese Routine funktioniert online auf meinem Webserver einwandfrei und ohne irgendwelche Meldungen, lokal auf OmniHTTPd mit ActivePerl aber nicht mehr. Hat jemand eine Vorstellung, woran das liegen könnte? Arbeitsspeicher ist unwahrscheinlich, da ich 80 MB habe und das Windows-Swapfile noch nicht mal halb so groß ist...
Cheatah
Moin Cheatah
5120 6F 6E 3A 6E 6F 6E 65 3B 20 7D 0A 0A 0A 0A 0A 2F on:nsubstr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 87.
[...]
substr outside of string at c:\programme\netz\homepage neu\test\surf\surf.pl line 89.
one; }...../
5136 2A 20 57 65 6E 6E 20 53 69 65 20 73 69 63 68 20 * Wenn Sie sich
5152 6D 69 74 20 53 74 79 6C 65 2D 53 68 65 65 74 73 mit Style-Sheets
[...]Wenn man genauer hinguckt merkt man, daß der Text "text-decoration:n[...]one;" verlustfrei unterbrochen wird. Die Fehlermeldung, die übrigens an verschiedenen Stellen in verschiedener Anzahl auftaucht, immer jedoch n mal in Zeile 87 und n mal in Zeile 89, kann ich zwar übersetzen, aber ich verstehe sie nicht. Sie wird in folgender Routine erzeugt:
Wie wäre es denn mit der Möglichkeit, daß die Fehler gar nicht an der Stelle passieren, an der die Ausgabe gestört wird - von wegen gepufferte Ausgabe und so ...
Dann könnte ich eine Theorie dazu beisteuern:
sub hexdump {
$z = length(length($_[0]));
print "<nobr><pre>\n";
print "Datei: $url\n";
print "Länge: ".length($_[0])." Bytes\n\n";
for ($i=0; $i<length($_[0]); $i+=16) {
print substr($i." ",0,$z)." ";
for ($j=$i; $j<=$i+15; $j++) { print &dez2hex(substr($_[0],$j,1))." "; }
print " ";
for ($j=$i; $j<=$i+15; $j++) { print &chrprint(substr($_[0],$j,1)); }
print "\n";
}
Wenn die Länge des Textes $_[0] nicht durch 16 teilbar ist, hast Du im letzten Schleifendurchlauf das Problem, daß $i+15 über das Ziel hinausschießt! Müßte man eigentlich abzählen können - Du gibst ja am Anfang auch die Länge mit aus ...
Gruß,
Jörk
Hi,
for ($i=0; $i<length($_[0]); $i+=16) {
Wenn die Länge des Textes $_[0] nicht durch 16 teilbar ist, hast Du im letzten Schleifendurchlauf das Problem, daß $i+15 über das Ziel hinausschießt! Müßte man eigentlich abzählen können - Du gibst ja am Anfang auch die Länge mit aus ...
Wahnsinn, das war in der Tat der Grund. Ich habe die Schleife jetzt auf $i<16*int(length($_[0])/16) reduziert und gebe den Rest in einer zweiten Schleife aus; das ist zwar nicht besonders schön, funktioniert aber :-)
Ich danke Dir!
Cheatah