Avatar billede sarid Nybegynder
17. april 2003 - 18:57 Der er 9 kommentarer

Hash problem

Jeg har en hash, som har en key og en value som er begge to integers.  Jeg vil gerne ligge et til hashens value hver gang en løkke køre.  Jeg har lavet et eksempel, der illustrerer problemet:

test.pl
-------
for ($index = 0; $index <= 10; $index++) {
  $HASH{$index} = ($HASH{$index}++);
  print($HASH{$index});
}

jeg vil gerne få følgende resultater:

#perl test.pl
1234567891011

men jeg før følgende resultater:

#perl test.pl
00000000000

Dette virker ikke.  Hvorfor?

På forhånd tak!
Sarid
Avatar billede kobe14 Nybegynder
17. april 2003 - 19:02 #1
LoL troede lige jeg kunne give en addresse til en meget dårlig ven der kunne få dig til at lave selvmord fordi du ikke gad at h0re på ham og dit Hash problem!
Avatar billede jespernaur Nybegynder
17. april 2003 - 19:29 #2
Dette her giver det resultat du efterlyser, men jeg er alt andet end overbevist om at det er det du er ude efter:

for ($index = 0; $index <= 10; $index++) {
  $HASH{$index} = $index+1;
  print($HASH{$index});
}

Du er forhåbentlig klar over at den hash du arbejder med, har 11 elementer?
Avatar billede kobe14 Nybegynder
17. april 2003 - 19:35 #3
hvad er hashhelt korekt
Avatar billede sarid Nybegynder
17. april 2003 - 20:01 #4
$key er en streng og $value er en integer.  Jeg vil gerne lægge en til $values nuværende værdi altså, $RESULTS{$key} = $RESULTS{$key}+1;  Dette virker ikke og jeg kan ikke forstå hvorfor.

Her er lidt af koden:

while (($key, $value) = each(%RESULTS))
{
  if ($key eq $word) {
    $RESULTS{$key} = $RESULTS{$key}+1;
  } else {
    $RESULTS{$word} = 0;
  }
}
Avatar billede jespernaur Nybegynder
17. april 2003 - 20:29 #5
Din løkke til at løbe hashen igennem ser rigtig nok ud, er du sikker på at $word indeholder det du forventer? Prøv at indsætte

print "key = $key, word = $word\n";

umiddelbart inden if-sætningen
Avatar billede sarid Nybegynder
17. april 2003 - 21:02 #6
Ah, det indeholder også tekst og ikke et tal..  Koden ser således ud:

sub scan()
{
  my (%RESULTS);
  my $flag;
   
  $RESULTS{"INIT"} = 0;
  foreach $file (@SPAM_FILES)
  {
    open(FILE, "<$file") || die($!);
    while (<FILE>)
    {
      @WORDS = split('\s+', $_);
      foreach $word (@WORDS)
      {
        while (($key, $value) = each(%RESULTS))
        {
          print "key = $key, word = $word\n";
          if ($key eq $word) {
      $RESULTS{$key} = ($RESULTS{$key} + 1);
        } else {
      #print("NOT\n");
          $RESULTS{$word} = 0;
        }
      }
    }
    while (@WORDS) { pop(@WORDS); }
  }
  close(FILE);
}
}
Avatar billede jespernaur Nybegynder
17. april 2003 - 21:31 #7
Du kommer til at give en lidt mere overordnet forklaring på hvad det er, du ønsker at opnå. Jeg kan ikke gætte det udfra den kode du har vist, især ikke, da jeg må gå ud fra, at det ikke virker som ønsket.

Du har desuden en list @SPAM_FILES, som ser ud til at indeholde filnavne. Der er også brug for, at du viser et par eksempler på indholdet af disse filer, helst med forklaring.
Avatar billede sarid Nybegynder
17. april 2003 - 21:58 #8
Det jeg gerne vil er at løbe en fil igennem og tælle hvor mange gange et ord findes i filen.  Jeg har valgt at placere resultaterne i en hash hvor nøglen ($key) indeholder ordet og det antal gange ordet forekommer i filen placeres i værdien ($value).
Avatar billede jespernaur Nybegynder
17. april 2003 - 22:16 #9
Så vidt jeg kan bedømme, må det kunne klares som vist herunder, hvor en af de vigtige ting er, at jeg har flyttet erklæringen af %RESULTS uden for scan, da den ellers ikke ville være tilgængelig udenfor scan. Jeg må nok bemærke, at det IKKE er testet.

my %RESULTS;

sub scan()
{
  foreach $file (@SPAM_FILES)
  {
    open(FILE, "<$file") || die($!);
    while (<FILE>)
    {
      foreach $word (split('\s+', $_))
      {
        $RESULTS{$word}++;
      }
    }
    close(FILE);
  }
}
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