Avatar billede nvr Nybegynder
17. august 2000 - 11:00 Der er 12 kommentarer og
1 løsning

Forkert rækkefølge

Følgende kode:

if (open(GW2,\"/hotel/nvr/WWW/forsideoverskrifter.txt\")) {
  @a = <GW2>;
  close(GW2);
}
        push(@a,\"<a\\thref=\\\"nyheder/$in{\'Filename\'}.shtml\\\">$in{\'Headline\'}</a><br><br>\\n\");
        open(GW2,\">/hotel/nvr/WWW/forsideoverskrifter.txt\");
        for ($i=$#a>=6?$#a-6:0; $i<=$#a; $i++) {
        print GW2 $a[$i];
}
close(GW2);

åbner en tekstfil og tilføjeer en linie. Problemet er, at den tilføjer den nye linie nederst. Hvordan får jeg den til at tilføje den nye linie øverst i filen?
Avatar billede erikjacobsen Ekspert
17. august 2000 - 11:41 #1
Det kan du ikke. Men du kan læse filen ind i et array, og så skrive den ud \"baglæns\"

open(F,....);
@a=<F>;
close(F);
for ($i=$#a;$i>=0;$i--) {
  print $a[$i];
}
Avatar billede nvr Nybegynder
17. august 2000 - 11:51 #2
Æhh... hvordan vil det så se ud med den givne kode?
Avatar billede y2k Nybegynder
17. august 2000 - 18:09 #3
open (F, \"filnavn\");
print \"første linie i teksten(som du selv indsætter)\\n\";
print <F>; #det er da et forsøg værd ;)
close F;
exit;

du kan så selv vælge om du vil lave et print FILEHANDLE \"besked\" eller bare et print \"besked\", det afhænger af, om du skal skrive til en fil eller bare skrive til skærmen..
Avatar billede y2k Nybegynder
17. august 2000 - 18:11 #4
if (open(GW2,\"/hotel/nvr/WWW/forsideoverskrifter.txt\")) {
  @a = <GW2>;
  close(GW2);

$nylinie = \"<a\\thref=\\\"nyheder/$in{\'Filename\'}.shtml\\\">$in{\'Headline\'}</a><br><br>\\n\";
open(GW2,\">/hotel/nvr/WWW/forsideoverskrifter.txt\");
print $nylinie;
print @a;
close GW2;
exit;
Avatar billede y2k Nybegynder
17. august 2000 - 18:12 #5
sorry, laver lige en rettelse..der skulle selvfølgelig stå:

print GW2 $nylinie;
print GW2 @a;

:-)
Avatar billede y2k Nybegynder
17. august 2000 - 20:20 #6
en endnu hurtigere måde at lave det på er, at bruge File::Slurp modulet..:

use File::Slurp;
$nylinie = \"<a\\thref=\\\"nyheder/$in{\'Filename\'}.shtml\\\">$in{\'Headline\'}</a><br><br>\\n\";
$filnavn = \"/hotel/nvr/WWW/forsideoverskrifter.txt\";
@a = read_file($filnavn);
overwrite_file($filnavn, ($nylinie,@a));
exit;
Avatar billede erikjacobsen Ekspert
17. august 2000 - 20:48 #7
Nemlig y2k, men det fundamentale er netop, at man ikke kan indsætte
noget før den første linie, uden at genskrive hele filen. Det er \"farligt\" hvis
der sker en fejl undervejs. Umiddelbart vil jeg mene at det er sikrere altid
at appende til filen - så er man sikker på at de andre linier ovenover er
på plads og i orden - og så må man så \"slurpe\" filen ind og vise den i den
anden rækkefølge. Hvad mener vores højt ærede spørger?
Avatar billede y2k Nybegynder
17. august 2000 - 20:54 #8
det er også derfor jeg valgte overwrite_file istedet for bare write_file, i og med at den er lidt mere hårdfør over for filen end den normale write_file er ;)..
med hensyn til det med risikoen, så kunne man jo også prøve at sætte noget flock() på ens filehandle..
Avatar billede y2k Nybegynder
17. august 2000 - 21:06 #9
man kunne selvfølgelig oxo gøre det på den helt sikre måde...

use File::Slurp;
$nylinie = \"<a\\thref=\\\"nyheder/$in{\'Filename\'}.shtml\\\">$in{\'Headline\'}</a><br><br>\\n\";
$filnavn = \"/hotel/nvr/WWW/forsideoverskrifter.txt\";
append_file($filnavn, $nylinie);
exit;

og så bare lave en @a = reverse @a; når man skulle hente @a frem, så ville nyeste linier jo være øverst ;)
Avatar billede nvr Nybegynder
22. august 2000 - 09:35 #10
Så har jeg endelig fået tid til at kigge på det. Y2k\'s første eksempel dur for så vidt fint, MEN nu sletter den ikke de \"ældste\" linier, hvis der er flere end 7.

Det var det, der stod i:

for ($i=$#a>=6?$#a-6:0; $i<=$#a; $i++) {
        print GW2 $a[$i];


Så hver gang der bliver tilføjet en linie, tilføjer den alle linier een gang til!
Avatar billede nvr Nybegynder
22. august 2000 - 09:44 #11
Der er forresten een ting til. Scriptet skriver til 2 filer, men efter y2k\'s modificering, låser den den anden fil og dermed ikke skriver til den...
Avatar billede nvr Nybegynder
29. august 2000 - 10:05 #12
Nå... jeg fik jo aldrig rigtig løst problemet, så jeg lukker spørgsmålet igen.

Bliver der vilde protester vil jeg naturligvis åbne et nyt spørgsmål...
Avatar billede nvr Nybegynder
29. august 2000 - 10:05 #13
-
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester