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