webForumDet fria alternativet

Kod fel.??

Perl & Rubyur Perl, Python, Ruby och övrig CGI

21 svar · 463 visningar · startad av cgi

Medlem sedan jan. 2000371 inlägg
Frågan#1

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;
}
Medlem sedan dec. 19996 721 inlägg
#2

...om du berättar vad som inte funkar.... ;)

Medlem sedan apr. 2000642 inlägg
#3

kan man låsa en fil och sen öppna den?

Medlem sedan jan. 2000371 inlägg
#4

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.

Medlem sedan dec. 19992 555 inlägg
#5

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 >

Medlem sedan dec. 19992 555 inlägg
#6

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 >

Medlem sedan jan. 2000371 inlägg
#7

$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.

Medlem sedan feb. 2000438 inlägg
#8

Kom du ihåg { efteråt?

while ($m < $visa) {

/Csson

Medlem sedan jan. 2000371 inlägg
#9

OK hade visst glömt det,
men den delar inte upp sidorna ändå.

Medlem sedan aug. 2000374 inlägg
#10

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]

Medlem sedan jan. 2000371 inlägg
#11

Nope, det funkar inte alls.

Medlem sedan aug. 2000374 inlägg
#12

Hej!
Vad är det som inte funka?
Fick du några felmeddelanden?

Klistra in din "nya" kod.

//Hansen

------------------
Hansen
c.h@ngmedia.com

Medlem sedan jan. 2000371 inlägg
#13

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]

Medlem sedan jan. 2000371 inlägg
#14

Ingen.???

Medlem sedan dec. 19992 555 inlägg
#15

$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 >

Medlem sedan jan. 2000371 inlägg
#16

Visst den finns att skåda på:
prodesign.nu/script.txt

Medlem sedan dec. 19992 555 inlägg
#17

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]

#18

Felregistrerat inlägg

[Redigerat av demo den 06 okt 2000]

Medlem sedan jan. 2000371 inlägg
#19

Ingen annan som vet vad felet kan vara.??

Medlem sedan jan. 2000371 inlägg
#20

Är det ingen som vet varför just ett enda inlägg printas ut.??

149 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)