Avatar billede simeone Nybegynder
12. marts 2004 - 14:20 Der er 20 kommentarer og
1 løsning

læs og skriv til en fil.

I nedenstående kode skal der læses fra filen liste.txt. Brugeren skal indtaste et navn, som så tjekkes mod de navne, der er på listen. Hvis navnet er på listen, skal der udskrives, at det er godkendt og vice versa. Men hvordan får jeg læst fra liste.txt? Desuden skal resultatet udskrives til en fil, fx output.txt. Sorry, men jeg har sikkert overset et eller andet meget simpelt...

#!/usr/bin/perl

$filename = "liste.txt";

open $inputstream, "<$filename";

print "Indtast et navn: ";
$x = readline(stdin);

if ($x = liste.txt)
{
"Navnet xxx er godkendt. \n";
}
else
{
"Navnet xxx er ikke godkendt. \n";
}
Avatar billede mfalck Praktikant
12. marts 2004 - 14:34 #1
for det første så skal du bruge "eq" til at sammenligne strenge i perl

dertil kommer at du kun har åbnet filen for læsning - men du skal køre den i en løkke ala

use FileHandle;
my $filename = "liste.txt";
my $filehandle = new FileHandle ("< $filename");

print "indtast navn:";
my $x=readline(stdin);
my $line;
while (<$fh>) {
    chomp;
    $line = $_;
  if ($x eq $line) {
    print "navnet $x er godkendt \n";
  }
  else
    {
    print "navnet $x er ikke godkendt\n";
  }
Avatar billede mfalck Praktikant
12. marts 2004 - 14:36 #2
hov dels en fejl og for at få resultatet i en fil:

use FileHandle;
my $filename = "liste.txt";
my $filename = "output.txt";
my $fh = new FileHandle ("< $filename");
my $oh = new FileHandle ("> $outfile");

print "indtast navn:";
my $x=readline(stdin);
my $line;
while (<$fh>) {
    chomp;
    $line = $_;
  if ($x eq $line) {
    print $oh "navnet $x er godkendt \n";
  }
  else
    {
    print $oh "navnet $x er ikke godkendt\n";
  }

exit 0;
Avatar billede mfalck Praktikant
12. marts 2004 - 14:37 #3
det er ikke sikkert at der skal laves en chomp .. hmm det må lige testes :-)
Avatar billede simeone Nybegynder
12. marts 2004 - 14:59 #4
hmm, jeg får at vide, at den "can't locate @Filehandle.pm in INC"?

Og desuden et par spørgsmål: Hvad gør chomp og my helt præcist?
Avatar billede mfalck Praktikant
12. marts 2004 - 15:20 #5
den skal hedde FileHandle - sorry

chomp fjerner \n fra dit input

my erklærer en variabel - det er "kun" nødvendigt hvis du bruger "use strict"
Avatar billede simeone Nybegynder
12. marts 2004 - 15:34 #6
nope, stadig ikke. Den siger, at liste.txt is not exported by the filehandle modul...
Avatar billede mfalck Praktikant
12. marts 2004 - 15:49 #7
hovsa - et par bøv fejl:

use strict;
use FileHandle;
my $filename = "liste.txt";
my $outfile = "output.txt";
my $fh = new FileHandle ("< $filename");
my $oh = new FileHandle ("> $outfile");

print "indtast navn:";
my $x=readline(stdin);
my $line;
while (<$fh>) {
    chomp;
    $line = $_;
  if ($x eq $line) {
    print $oh "navnet $x er godkendt \n";
  }
  else {
    print $oh "navnet $x er ikke godkendt\n";
  }
}
exit 0;
Avatar billede simeone Nybegynder
12. marts 2004 - 16:01 #8
Desværre, stadig ikke. Den siger "Global symbol "$outfile" requires explicit package name" og "Bareword "stdin" not allowed while "strict subs in use". Hvad det så en betyder.. kan nr. 2 rettes ved at slette strict og my?
Avatar billede mfalck Praktikant
12. marts 2004 - 21:56 #9
ja men det betyder at du har en fejl i programmet - jeg forstår det ikke helt for den virker på min maskine
Avatar billede simeone Nybegynder
13. marts 2004 - 14:02 #10
ok, nu får jeg ingen fejlmeddelelser, men til gengæld er det eneste der sker, at den siger "tryk på en vilkårlig tast" efter jeg har tastet navnet ind...
Avatar billede mfalck Praktikant
13. marts 2004 - 14:03 #11
ok - skriver den så til output.txt ?
Avatar billede mfalck Praktikant
13. marts 2004 - 14:04 #12
use strict;
use FileHandle;
my $filename = "liste.txt";
my $outfile = "output.txt";
my $fh = new FileHandle ("< $filename");
my $oh = new FileHandle ("> $outfile");

print "indtast navn:";
my $x=readline(stdin);
my $line;
while (<$fh>) {
    chomp;
    $line = $_;
  if ($x eq $line) {
    print $oh "navnet $x er godkendt \n";
    print "navnet $x er godkendt \n";
  }
  else {
    print $oh "navnet $x er ikke godkendt\n";
    print "navnet $x er ikke godkendt\n";
  }

}
exit 0;
Avatar billede mfalck Praktikant
13. marts 2004 - 14:04 #13
den vil både skrive resultatet på skærmen og i filen !
Avatar billede simeone Nybegynder
13. marts 2004 - 14:04 #14
ups, jo output havner i outputfilen, men det står der flere hundrede gange. Hvordan kan jeg begrænse løkken, så den kun skriver output én gang?
Avatar billede mfalck Praktikant
13. marts 2004 - 14:08 #15
use strict;
use FileHandle;
my $filename = "liste.txt";
my $outfile = "output.txt";
my $fh = new FileHandle ("< $filename");
my $oh = new FileHandle ("> $outfile");

my $found = 0;

print "indtast navn:";
my $x=readline(stdin);

while (<$fh>) {
  if ($x eq $_) {
    $found =1;
  }
}

  if ($found == 1) {
    print $oh "navnet $x er godkendt \n";
    print "navnet $x er godkendt \n";
  }  else {
    print $oh "navnet $x er ikke godkendt\n";
    print "navnet $x er ikke godkendt\n";
  }


exit 0;
Avatar billede simeone Nybegynder
13. marts 2004 - 14:09 #16
og en lille ting mere; den skriver, at et givent navn ikke er godkendt, også selvom det står på listen. Det er ligemeget hvilket navn...
Avatar billede mfalck Praktikant
13. marts 2004 - 14:17 #17
den her virker på min linux-maskine:


use strict;
use FileHandle;
my $filename = "liste.txt";
my $outfile = "output.txt";
my $fh = new FileHandle ("< $filename");
my $oh = new FileHandle ("> $outfile");

my $found = 0;

print "indtast navn:";
my $x;
chomp($x=<STDIN>);

while (<$fh>) {
  chomp;
  if ($x eq $_) {
    $found =1;
  }
}


  if ($found == 1) {
    print $oh "navnet $x er godkendt \n";
    print "navnet $x er godkendt \n";
  }  else {
    print $oh "navnet $x er ikke godkendt\n";
    print "navnet $x er ikke godkendt\n";
  }


exit 0;
--------------------
liste.txt:
mfalck
ost
ged

output.txt:

navnet ost er godkendt
navnet ost er godkendt
navnet nisse er ikke godkendt
Avatar billede simeone Nybegynder
13. marts 2004 - 14:25 #18
hmm, jeg sidder godt nok på en windows, men det skulle da ikke gøre så meget i denne forbindelse. Det virker som om, den ikke kan læse ordentligt fra liste-filen... Men det kan være, jeg overser noget på min egen computer... Men tak for hjælpen i hvert fald :-)
Avatar billede mfalck Praktikant
13. marts 2004 - 14:27 #19
ok .. man skulle ikke tro at der var så stor forskel på windows og linux.. evt kan du prøve at skrive værdierne ud på skærmen og sammenligne dem
Avatar billede karrieremanden Nybegynder
23. april 2005 - 00:23 #20
Hej, jeg har lige testet dette på en windows 2000 kasse, og det virker uden at ændre i noget !

Vh.
Avatar billede osborne Praktikant
29. oktober 2005 - 22:12 #21
Du har 16 åbne spørgsmål .. husk at lukke.
Sådan lukker du et spørgsmål: http://expfaq.1go.dk/?id=3#behandling_af_svar
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