Need Hash Help

R

raymond

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!
 
A

Azazel

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";
}
 
R

Randal L. Schwartz

Azazel> In 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.
 
R

raymond

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!
 
J

Joe Smith

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
 
R

Randal L. Schwartz

raymond> Now if you don't mind, I'm trying to figure out why this worked and mine
raymond> didn'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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,922
Messages
2,570,047
Members
46,473
Latest member
DaveBrowde

Latest Threads

Top