---
title: "Kod fel.??"
type: "forum-thread"
url: "https://www.webforum.nu/amne/perl-ruby/19214-kod-fel"
topic: "Perl & Ruby"
topic_url: "https://www.webforum.nu/amne/perl-ruby"
author: "cgi"
published: "2000-10-01T22:52:00.000Z"
updated: "2000-11-19T17:12:00.000Z"
replies: 21
views: 484
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/perl-ruby/19214-kod-fel"
---

# Kod fel.??

_Sida 1 av 2._

## #1 — cgi, 2000-10-01T22:52Z

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;
}
```

Permalänk: https://www.webforum.nu/p/19214

## #2 — emission, 2000-10-01T23:31Z

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

Permalänk: https://www.webforum.nu/p/341271

## #3 — Peter_B, 2000-10-02T12:47Z

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

Permalänk: https://www.webforum.nu/p/341272

## #4 — cgi, 2000-10-02T13:17Z

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.

Permalänk: https://www.webforum.nu/p/341273

## #5 — Robban, 2000-10-02T14:43Z

> 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: $!";

...
```

Permalänk: https://www.webforum.nu/p/341274

## #6 — Robban, 2000-10-02T14:52Z

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

Permalänk: https://www.webforum.nu/p/341275

## #7 — cgi, 2000-10-02T16:48Z

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

Permalänk: https://www.webforum.nu/p/341276

## #8 — Csson, 2000-10-02T17:12Z

Kom du ihåg **{** efteråt?

while ($m \< $visa) {

/Csson

Permalänk: https://www.webforum.nu/p/341277

## #9 — cgi, 2000-10-02T17:33Z

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

Permalänk: https://www.webforum.nu/p/341278

## #10 — Hansen, 2000-10-02T18:24Z

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

Permalänk: https://www.webforum.nu/p/341279

## #11 — cgi, 2000-10-02T20:58Z

Nope, det funkar inte alls.

Permalänk: https://www.webforum.nu/p/341280

## #12 — Hansen, 2000-10-02T21:53Z

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

Klistra in din "nya" kod.

//Hansen

Permalänk: https://www.webforum.nu/p/341281

## #13 — cgi, 2000-10-02T22:14Z

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\]

Permalänk: https://www.webforum.nu/p/341282

## #14 — cgi, 2000-10-04T12:05Z

Ingen.???

Permalänk: https://www.webforum.nu/p/341283

## #15 — Robban, 2000-10-05T01:13Z

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

Permalänk: https://www.webforum.nu/p/341284

## #16 — cgi, 2000-10-05T11:51Z

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

Permalänk: https://www.webforum.nu/p/341285

## #17 — Robban, 2000-10-06T02:02Z

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](http://www.perl.com/newdocs/pod/perlopentut.html). 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?

Permalänk: https://www.webforum.nu/p/341286

## #18 — demo, 2000-10-06T06:01Z

Felregistrerat inlägg

\[Redigerat av demo den 06 okt 2000\]

Permalänk: https://www.webforum.nu/p/341287

## #19 — cgi, 2000-10-20T11:51Z

Ingen annan som vet vad felet kan vara.??

Permalänk: https://www.webforum.nu/p/341288

## #20 — cgi, 2000-10-24T16:53Z

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

Permalänk: https://www.webforum.nu/p/341289

---

Tråden på webben: https://www.webforum.nu/amne/perl-ruby/19214-kod-fel  
Nästa sida: https://www.webforum.nu/amne/perl-ruby/19214-kod-fel/page2.md
