Need Hash Help

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • raymond@new.orleans

    Need Hash Help

    Hi, I'm going out of my mind trying to figure this problem out. To save it,
    I figured I'd ask for some help :)

    I'm trying to create a hash with name/answer pairs.

    I retrieve a person's userid ($name) and their response ($answer) to a
    multiple choice question in a poll.

    I'm trying to store these into a simple hash:

    $responses{ $name } = $answer;

    I haven't used perl in quite some time and I THOUGHT this was the proper way
    to store these hash pairs but it's not working.

    Once I complete getting all the different people's names and answers in one
    question, I sort them by answer then print out a single answer with all the
    names who chose that answer.

    I'd appreciate any help anyone can give me.

    Thanks in advance!
  • Azazel

    #2
    Re: Need Hash Help

    On 2007-07-16, raymond@new.orl eans <raymond@new.or leanswrote:
    Hi, I'm going out of my mind trying to figure this problem out. To save it,
    I figured I'd ask for some help :)
    >
    I'm trying to create a hash with name/answer pairs.
    >
    I retrieve a person's userid ($name) and their response ($answer) to a
    multiple choice question in a poll.
    >
    I'm trying to store these into a simple hash:
    >
    $responses{ $name } = $answer;
    >
    I haven't used perl in quite some time and I THOUGHT this was the proper way
    to store these hash pairs but it's not working.
    >
    Once I complete getting all the different people's names and answers in one
    question, I sort them by answer then print out a single answer with all the
    names who chose that answer.
    >
    I'd appreciate any help anyone can give me.
    In that case you want the keys and values the other way round:

    if (!$responses{$a nswer})
    {
    $responses{$ans wer} = [ $name ];
    }
    else
    {
    push @{$responses{$a nswer}}, $name;
    }

    foreach $answer (sort keys %responses)
    {
    print "$answer: ", join (", ", @{$responses{$a nswer}}), "\n";
    }

    Comment

    • raymond@new.orleans

      #3
      Re: Need Hash Help


      On 16-Jul-2007, Azazel <azazel@azazel. netwrote:
      In that case you want the keys and values the other way round:
      >
      if (!$responses{$a nswer})
      {
      $responses{$ans wer} = [ $name ];
      }
      else
      {
      push @{$responses{$a nswer}}, $name;
      }
      >
      foreach $answer (sort keys %responses)
      {
      print "$answer: ", join (", ", @{$responses{$a nswer}}), "\n";
      }

      Hey, thanks SO MUCH! That worked like a charm!

      Now if you don't mind, I'm trying to figure out why this worked and mine
      didn't.

      It seems the statement: $responses{$ans wer] = [ $name ] is a hash of arrays
      (very clever!) but why didn't my original attempt work:

      $responses{$nam e} = $answer;

      After assigning the values I tried to print them out. $name printed out ok
      but the corresponding $answer was a null value.

      Thank you!

      Comment

      • Joe Smith

        #4
        Re: Need Hash Help

        raymond@new.orl eans wrote:
        I'm trying to create a hash with name/answer pairs.
        >
        I retrieve a person's userid ($name) and their response ($answer) to a
        multiple choice question in a poll.
        >
        I'm trying to store these into a simple hash:
        >
        $responses{ $name } = $answer;
        If you have the name already and are looking to store or retrieve their
        one-and-only-answer, that is the way to do it. If you are having problems,
        it is somewhere else in your program not in that statement.
        Once I complete getting all the different people's names and answers in one
        question, I sort them by answer
        perldoc -q 'by value'
        then print out a single answer with all the names who chose that answer.
        You say "single answer" which implies a hash keyed by answer, not by name.
        You say "all the names" which implies the hash value will be an array of names.

        So, by your own words, you are looking for a hash of arrays where the hash
        is indexed by $answer and the value is is an anonymous array containing
        multiple $name entries.

        Any further questions should be accompanied by a short but functional program
        showing what you've got so far, and should be posted to the comp.lang.perl. misc
        newsgroup (not comp.lang.perl since this newsgroup is defunct).

        -Joe

        Comment

        • Randal L. Schwartz

          #5
          Re: Need Hash Help

          >>>>"Azazel" == Azazel <azazel@azazel. netwrites:

          AzazelIn that case you want the keys and values the other way round:

          Azazel if (!$responses{$a nswer})
          Azazel {
          Azazel $responses{$ans wer} = [ $name ];
          Azazel }
          Azazel else
          Azazel {
          Azazel push @{$responses{$a nswer}}, $name;
          Azazel }

          Or just:

          push @{$responses{$a nswer}}, $name;

          since autovivificatio n will Do The Right Thing when $responses{$ans wer} is
          undef.

          --
          Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
          <merlyn@stonehe nge.com<URL:htt p://www.stonehenge. com/merlyn/>
          Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
          See PerlTraining.St onehenge.com for onsite and open-enrollment Perl training!

          --
          Posted via a free Usenet account from http://www.teranews.com

          Comment

          • Randal L. Schwartz

            #6
            Re: Need Hash Help

            >>>>"raymond" == raymond <raymond@new.or leanswrites:

            raymondNow if you don't mind, I'm trying to figure out why this worked and mine
            raymonddidn't.

            STOP POSTING HERE. THIS IS A DEAD GROUP.

            The fact that *your* news server (and a few thousand others) still carry
            it is not justification for posting in a *dead* group.

            The group you want is comp.lang.perl. misc.

            --
            Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
            <merlyn@stonehe nge.com<URL:htt p://www.stonehenge. com/merlyn/>
            Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
            See PerlTraining.St onehenge.com for onsite and open-enrollment Perl training!

            --
            Posted via a free Usenet account from http://www.teranews.com

            Comment

            • raymond@new.orleans

              #7
              Re: Need Hash Help


              On 17-Jul-2007, Joe Smith <joe@inwap.comw rote:
              and should be posted to the
              comp.lang.perl. misc
              newsgroup (not comp.lang.perl since this newsgroup is defunct)
              Ok thanks, I didn't know that. I do now.

              Comment

              Working...