På forhånd undskyld det lange indlæg, men jeg kunne ikke lige finde ud af
at forklare mit problem uden at inkludere en del kode - men altså:
Jeg holder en webside for en radio-station, og får hver uge tilsendt deres
dansktop i Word-format, som jeg konverterer til ren tekst (med antiword
uden problemer - så langt så godt.
I ren tekst ser en linie f.eks. sådan her ud:
|12|Bar' det ikke går helt galt |Hannibal Henrik Hildorf |12 |5 |10 |
Altså placering, titel, kunstner, placering sidste uge, antal uger og
højeste placering.
Jeg har så lavet et script der konverterer hele dynen til HTML, og det har
virket fint indtil nu.
Der er hver uge fem boblere, hvor linierne ser sådan her ud:
|22|Bar' det ikke går helt galt |Hannibal Henrik Hildorf | | | |
Altså blank i de tre sidste felter. Det konverterer jeg med følgende stump:
if (@lines[($i+$count)] =~ /^\|\s*[0-9]+\s*\|/)
{
@lines[($i+$count)] =~ /^\|\s*.*\s*\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/;
@titel[$listenr] = $1;
@kunstner[$listenr] = $2;
@sidst[$listenr] = $3;
@uger[$listenr] = $4;
@max[$listenr] = $5;
$listenr++;
}
else
{
@lines[($i+$count)] =~ /^\|\s*\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/;
@titel[$listenr-1] = @titel[$listenr-1] . $1;
@kunstner[$listenr-1] = @kunstner[$listenr-1] . $2;
@sidst[$listenr-1] = @sidst[$listenr-1] . $3;
@uger[$listenr-1] = @uger[$listenr-1] . $4;
@max[$listenr-1] = @max[$listenr-1] . $5;
$listlength++;
}
else-tingen er for det tilfælde at et af felterne er for langt og bliver
ombrudt i cellen af word, og kommer til at stå på to linier i tekstfilen.
Som det ses er jeg heller ikke interesseret i placeringen (første felt), da
denne alligevel genereres internt...
Og her kommer så mit problem: Hver uge siges farvel til fem numre. Det ser
så sådan her ud:
| |Bar' det ikke går helt galt |Hannibal Henrik Hildorf |22 |0 |0 |
I dette tilfælde kom bobleren altså ikke ind. Koden er så:
if (@lines[($i+$count)] =~ /\|\s*[0-9]+\s*\|/)
{
@lines[($i+$count)] =~ /^\|\s*\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/;
@titel[$listenr] = $1;
@kunstner[$listenr] = $2;
@sidst[$listenr] = $3;
@uger[$listenr] = $4;
@max[$listenr] = $5;
$listenr++;
}
else
{
@lines[($i+$count)] =~ /^\|\s*\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/;
@titel[$listenr-1] = @titel[$listenr-1] . $1;
@kunstner[$listenr-1] = @kunstner[$listenr-1] . $2;
@sidst[$listenr-1] = @sidst[$listenr-1] . $3;
@uger[$listenr-1] = @uger[$listenr-1] . $4;
@max[$listenr-1] = @max[$listenr-1] . $5;
$listlength++;
}
Virker fint. Men i denne uge har vedkommende der har skrevet listen
efterladt feltet med højeste placering (sidste felt i linien) blankt
(består altså af tre spaces) - og det opdagede jeg først da jeg kiggede på
top og så, at scriptet har brugt ca. 98% CPU-kraft siden middag i går!
Jeg har prøvet at trace igennem scriptet og fundet ud af, at når den når
linien med det sidste felt uden noget tal, så hopper den konstant til
else-delen og hænger så i et endeløst loop (ovenstående kodestump er pakket
ind i en for-løkke, der tæller op til $listlength)...
Ud af det vil jeg så gætte på at det er mine regulære udtryk der er gale -
jeg har prøvet lidt frem og tilbage, men kan ikke få det til at virke.
Er der en perl-ekspert tilstede?
--
Lars Rander,
www.rander.dk ICQ#: 987520 ** Pil ikke ved min adresse **
Sjathelt og beskytter af det svage køn (udnævnt af diktator SEJ 5/6-99)
Den første halvdel af vores liv bliver ødelagt af vores forældre,
den anden af vores børn. (Clarence Darrow)