Connecting Tech Pros Worldwide Help | Site Map

Need Hash Help

raymond@new.orleans
Guest
 
Posts: n/a
#1: Jul 16 '07
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
Guest
 
Posts: n/a
#2: Jul 16 '07

re: Need Hash Help


On 2007-07-16, raymond@new.orleans <raymond@new.orleanswrote:
Quote:
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{$answer})
{
$responses{$answer} = [ $name ];
}
else
{
push @{$responses{$answer}}, $name;
}

foreach $answer (sort keys %responses)
{
print "$answer: ", join (", ", @{$responses{$answer}}), "\n";
}
raymond@new.orleans
Guest
 
Posts: n/a
#3: Jul 17 '07

re: Need Hash Help



On 16-Jul-2007, Azazel <azazel@azazel.netwrote:
Quote:
In that case you want the keys and values the other way round:
>
if (!$responses{$answer})
{
$responses{$answer} = [ $name ];
}
else
{
push @{$responses{$answer}}, $name;
}
>
foreach $answer (sort keys %responses)
{
print "$answer: ", join (", ", @{$responses{$answer}}), "\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{$answer] = [ $name ] is a hash of arrays
(very clever!) but why didn't my original attempt work:

$responses{$name} = $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!
Joe Smith
Guest
 
Posts: n/a
#4: Jul 17 '07

re: Need Hash Help


raymond@new.orleans wrote:
Quote:
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.
Quote:
Once I complete getting all the different people's names and answers in one
question, I sort them by answer
perldoc -q 'by value'
Quote:
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
Randal L. Schwartz
Guest
 
Posts: n/a
#5: Jul 17 '07

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{$answer})
Azazel {
Azazel $responses{$answer} = [ $name ];
Azazel }
Azazel else
Azazel {
Azazel push @{$responses{$answer}}, $name;
Azazel }

Or just:

push @{$responses{$answer}}, $name;

since autovivification will Do The Right Thing when $responses{$answer} is
undef.

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

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

Randal L. Schwartz
Guest
 
Posts: n/a
#6: Jul 17 '07

re: Need Hash Help


>>>>"raymond" == raymond <raymond@new.orleanswrites:

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@stonehenge.com<URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

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

raymond@new.orleans
Guest
 
Posts: n/a
#7: Jul 18 '07

re: Need Hash Help



On 17-Jul-2007, Joe Smith <joe@inwap.comwrote:
Quote:
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.
Closed Thread