cgiMedlem sedan jan. 2000371 inlägg Någon som skulle kunna rätta till denna kod så den funkar:
sub lista{
$k=0;
flock(FILE,$lock);
open (FILE,"$topplista");
while ($rad=<FILE> ){
$rad=~/(.*) (.*)/;
$array[$k][0] =$1;
$array[$k][1] =$2;
$k++;
}
close (FILE);
flock(FILE,$unlock);
@array = sort { $b->[0] <=> $a->[0] } @array;
$tot_antal_poster = flock;
$start = $INFO{'rec'};
$stop = $INFO{'rec'} + $poster_per_sida - 1;
$stop = $tot_antal_poster - 1 if ($stop > $tot_antal_poster);
$nav = sid_navigering($INFO{'rec'}, $tot_antal_poster,);
print "Content-type: text/html\n\n";
print "html kod...........";
$m=0;
until ($m eq $visa){
$plac=$m;
$plac++;
if($array[$m][0] eq ""){
exit;
}
print "<tr>";
print "<td width=\"35\" bgcolor=\"#C0C0C0\"><small>$plac</small></td>";
print "<td width=\"35\" bgcolor=\"#C0C0C0\"><small>$array[$m][0]</small></td>";
print "<td width=\"400\" bgcolor=\"#COCOCO\"><small>$array[$m][1]</small></td>";
print "</tr>";
$m++;
}
sub sid_navigering{
my ($start, $tot_antal_poster, $form) = @_;
my $antal_sidor = int(($tot_antal_poster - 1)/$poster_per_sida) + 1;
my $sida;
my @navigering;
for ($sida=1;$sida<=$antal_sidor;$sida++) {
my $sidan = ($sida-1)*$poster_per_sida;
my $sida_start = ($sida-1)*$poster_per_sida + 1;
my $sida_stop = $sida*$poster_per_sida;
$sida_stop = $tot_antal_poster if ($sida_stop > $tot_antal_poster);
if ($sidan == $start) {
if ($visa_range){
push(@navigering,"$sida_start-$sida_stop");
}
else{
push(@navigering,$sida);
}
}
else {
if ($visa_range){
push(@navigering,"<a href=\"fraga.cgi?lista=ja&rec=$sidan$form\">$sida_start-$sida_stop</a>");
}
else{
push(@navigering,"<a href=\"fraga.cgi?lista=ja&rec=$sidan$form\">$sida</a>");
}
}
}
if ($visa_next_prev){
if ($start-$poster_per_sida >= 0){
my $prev = $start-$poster_per_sida;
unshift(@navigering,"<a href=\"fraga.cgi?lista=ja&rec=$prev$form\">Föregående</a>");
}
if ($start+$poster_per_sida < $tot_antal_poster){
my $next = $start+$poster_per_sida;
push(@navigering,"<a href=\"fraga.cgi?lista=ja&rec=$next$form\">Nästa</a>");
}
}
my $nav = join("$avgransare",@navigering);
return $nav;
}
emissionMedlem sedan dec. 19996 721 inlägg ...om du berättar vad som inte funkar.... ;)
Peter_BMedlem sedan apr. 2000642 inlägg kan man låsa en fil och sen öppna den?
cgiMedlem sedan jan. 2000371 inlägg Vad som inte funkar:
den skriver ut alla inlägg utan att dela upp sidorna.
Vet ej vad som fattas eller är fel i koden, därför behöver jag hjälp av någon som kanske kan se vad som är fel med den.
RobbanMedlem sedan dec. 19992 555 inlägg
kan man låsa en fil och sen öppna den?
Man kan ju försöka. :)
Men nä, det har du rätt i. När flock() används i detta script existerar ju inte ens filhantaget FILE. Och om man har varningar påslaget får man följdaktligen följande meddelande när man försöker:
flock() on closed filehandle ...
Dessutom bör man alltid kolla så att filöppningar, fillåsningar m.m. lyckas innan man kör vidare.
...
use Fcntl ':flock';
open FILE, $topplista or die "Filöppning misslyckades: $!";
flock FILE, LOCK_SH or die "Fillåsning misslyckades: $!";
...
------------------
Robban < robban@lipogram.com >
RobbanMedlem sedan dec. 19992 555 inlägg cgi:
until ($m eq $visa){
Det kan inte vara så att du glömt sätta $visa? I.a.f. kan inte jag se att du gör det någonstans?
Om $visa är odefinierad så kommer vilkoret $m eq $visa aldrig att uppfyllas.
Sådana villkor skrivs rent allmänt bättre som:
while ($m < $visa)
Operanden eq är tänkt att användas vid jämförelse av tecken (t.ex. strängar), inte siffror.
------------------
Robban < robban@lipogram.com >
cgiMedlem sedan jan. 2000371 inlägg $visa finns i scriptet längre upp,
testade att byta ut
until ($m eq $visa){
till
while ($m < $visa)
men då funkar inte scriptet alls.
cgiMedlem sedan jan. 2000371 inlägg OK hade visst glömt det,
men den delar inte upp sidorna ändå.
HansenMedlem sedan aug. 2000374 inlägg Testa och kör in den här koden.
# ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8<
$tot_antal_poster = $#array;
$start = $INFO{'rec'};
$stop = $INFO{'rec'} + $poster_per_sida - 1;
$stop = $tot_antal_poster - 1 if ($stop > $tot_antal_poster);
$nav = sid_navigering($INFO{'rec'}, $tot_antal_poster,);
print "Content-type: text/html\n\n";
print "html kod...........";
for $i ( $start .. $stop ) {
if ($array[$i][0] eq "") {
next;
}
$plac=$i;
$plac++;
print "<tr>";
print "<td width=\"35\" bgcolor=\"#C0C0C0\"><small>$plac</small></td>";
print "<td width=\"35\" bgcolor=\"#C0C0C0\"><small>$array[$i][0]</small></td>";
print "<td width=\"400\" bgcolor=\"#COCOCO\"><small>$array[$i][1]</small></td>";
print "</tr>";
}
# ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8<
//Hansen
------------------
Hansen
c.h@ngmedia.com
[Redigerat av Hansen den 02 okt 2000]
[Redigerat av Hansen den 02 okt 2000]
cgiMedlem sedan jan. 2000371 inlägg Nope, det funkar inte alls.
HansenMedlem sedan aug. 2000374 inlägg Hej!
Vad är det som inte funka?
Fick du några felmeddelanden?
Klistra in din "nya" kod.
//Hansen
------------------
Hansen
c.h@ngmedia.com
cgiMedlem sedan jan. 2000371 inlägg Förut skrev den ut alla resultaten utan att dela upp sidorna, nu printar den ut endast ett enda resultat.
Här kommer den uppdaterade koden:
sub lista{
use Fcntl ':flock';open FILE, $topplista or die "Filöppning misslyckades: $!";flock FILE, LOCK_SH or die "Fillåsning misslyckades: $!";
$k=0;
flock(FILE,$lock);
open (FILE,"$topplista");
while ($rad=<FILE> ){
$rad=~/(.*) (.*)/;
$array[$k][0] =$1;
$array[$k][1] =$2;
$k++;
}
close (FILE);
flock(FILE,$unlock);
@array = sort { $b->[0] <=> $a->[0] } @array;
open (DATABASE, $topplista);
@GB = <DATABASE>;
close DATABASE;
@GB = reverse (@GB);
$tot_antal_poster = $#array;
$start = $INFO{'rec'};
$stop = $INFO{'rec'} + $poster_per_sida - 1;
$stop = $tot_antal_poster - 1 if ($stop > $tot_antal_poster);
$nav = sid_navigering($INFO{'rec'}, $tot_antal_poster,);
print "Content-type: text/html\n\n";
print "html kod....";
for $i ( $start .. $stop ) {
if ($array[$i][0] eq "") {
next;
}
$plac=$i;
$plac++;
print "<tr>";
print "<td width=\"35\" bgcolor=\"#C0C0C0\"><small>$plac</small></td>";
print "<td width=\"35\" bgcolor=\"#C0C0C0\"><small>$array[$i][0]</small></td>";
print "<td width=\"400\" bgcolor=\"#COCOCO\"><small>$array[$i][1]</small></td>";
exit;
$m++;
}
sedan
sub sid_navigering{
som ser lika ut som ovan.
[Redigerat av cgi den 03 okt 2000]
RobbanMedlem sedan dec. 19992 555 inlägg
$visa finns i scriptet längre upp ...
Är du 100% säker på att problemet finns i den del av scriptet du skickade hit? Om inte kanske det skulle hjälpa om vi fick se hela scriptet. Lägg gärna upp det som textfil någonstans så att man kan ladda ner det (det blir lätt oöverskådligt om det postas hit).
Om inte while ($m < $visa) { ... } stoppar i tid, så beror det antagligen på att $m inte uppräknas som avsett (men det verkar den göra, vad jag kan se vid en snabb koll) eller att $visa inte innehåller det du förväntar dig (och att innehållet i $m aldrig blir större eller lika med innehållet i $visa). Det senare har vi ju ingen möjlighet att kontrollera om vi inte får se den del av scriptet sär $visa sätts.
------------------
Robban < robban@lipogram.com >
cgiMedlem sedan jan. 2000371 inlägg Visst den finns att skåda på:
prodesign.nu/script.txt
RobbanMedlem sedan dec. 19992 555 inlägg Ok. Börja med att alltid använda varningsflaggan, -w. Byt alltså ut första raden mot:
#!/usr/bin/perl -w
På så sätt varnar Perl om konstigheter som hittas i koden. Och om du kör denna kod med varningsflagga misstänker jag att du får en hel del sådana varningar. ;)
Nu har du ju skrivit om scriptet ser jag, så loopen jag pekade på finns ö.h.t. inte kvar längre. Utgår ändå från din första version, och undrar då vad denna rad innebär:
$visa="100000";
1. Varför ett strängvärde? Du jämförde ju med $m som hade ett numeriskt värde.
2. Om $visa är satt till 100000 så kommer ju också loopen att köras tills $m når 100000. Är det verkligen vad du vill? Varför är $visa satt till 100000?
Raderna jag tipsade om (angående fillåsning och filöppning) verkar lite inslängda på måfå? Och de felaktiga raderna finns ju fortfarande kvar. Tanken var att du skulle byta ut de felaktiga mot de jag tipsade om. D.v.s. på alla ställen där du använder flock() före open() så byter du ordning så att filen redan är öppen när du försöker låsa den. Annars fungerar inte låsningen.
En bra tutorial om filöppningar är f.ö. perlopentut. Rekommenderas alla som håller på med Perl (ingår i perlinstallationen f.o.m. version 5.6.0 - skriv bara perldoc perlopentut vid prompten).
I övrigt så är koden lite för rörig och innehåller lite för många fel för att jag skall orka sätta mig in i den, tyvärr (någon annan kanske har tid över). Men jag skulle föreslå att du börjar med att strukturera upp det hela (vad jag kan se sätter du t.ex. variabler som sedan ö.h.t. inte används) och att bli av med de varningar som varningsflaggan rapporterar. En bättre struktur kanske inte gör att det fungerar bättre, men det förenklar om någon skall sätta sig in i hur det fungerar.
Bygger detta script på ett färdigt script, eller har du skrivit det själv?
------------------
Robban < robban@lipogram.com >
[Redigerat av Robban den 06 okt 2000]
demo
Felregistrerat inlägg
[Redigerat av demo den 06 okt 2000]
cgiMedlem sedan jan. 2000371 inlägg Ingen annan som vet vad felet kan vara.??
cgiMedlem sedan jan. 2000371 inlägg Är det ingen som vet varför just ett enda inlägg printas ut.??