<snip>
> Conceptually, what you have is a tree. There are
> three
> branches from the root, one for each foul type, and
> each of these is split into a further three
> branches,
> one for each player.
> 

Like this:

                 -->Rodriguez{numFouls}
     -->offensive-->Chan{numFouls}
                 -->Smith{numFouls}

                -->Rodriguez{numFouls}
fouls-->personal-->Chan{numFouls}
                -->Smith{numFouls}

                -->Rodriguez{numFouls}
     -->shooting-->Chan{numFouls}
                -->Smith{numFouls}

That's what I conceptually see, and what I think it
should be.


> Internally what you have is a hash, %fouls, which
> relates
> foul types (as the hash keys) to hash references (as
> the
> values). Each of these references refer to a hash
> which
> relates player names (as the keys) to foul count (as
> the values).
> 

internally, that looks like this, right?
$fouls{offensive}{Chan}

then substitute the foultype and the player name for
the 8 other options.

> It may be helpful to do this
> 
>   use Data::Dumper;
>   print Dumper \%fouls;
> 

the call to print is after I've written the hash,
right?  and the use Data::Dumper;  is just like typing
use strict; right?  I don't have to do anything else
with that I suppose?


> which will output Perl code to reconstruct the hash
> contents. It provides a useful visual representation
> of the hash you've built.
> 
> > I took a bit of a leap from this earlier example:
> > $fouls{$1}++;
> > Which kept track of the number of fouls for each
> > player, but grouped all fouls together.
> >
> > > which, if $1 eq 'Chan' and $3 eq 'offensive'
> would
> > > increment the element
> > >
> > >   $fouls{offensive}{Chan}
> > >


I actually did something like this when I had 1-d
hashes, but six of them, one for every different
foul(for simplicity's sake, I've just written names of
3 diff kinds of fouls), but then I thought I'd have to
write a bunch of lines like you wrote for the 2-d
hash, which I thought would be cumbersome, since there
are plenty of different names.
I had something like:
if ($3 eq 'Offensive')
{
 $offensive{$1}++;
}

That's when he suggested that I didn't have to match
$3 or $1 to anything, and so sent me on a chase to
figure out how.  That's how I came up with the thought
that I'm not matching the name in the example above
($1) so perhaps I could write a line like so: 
$fouls{$3}{$1}++;
and that would do the same thing if wrote:

if ($1 eq 'Chan' and $3 eq 'offensive')
{
 $fouls{$3}{$1}++;
}
or something like that.
So this is what I'd like to do, count fouls without
using string comparison operators.

> > > Which is a lot nicer as you don't then have to
> > > declare
> > > a scalar variable for every possible player. Be
> > > careful about upper and lower case characters
> > > though:
> > > as far as Perl's concerned 'Chan' and 'chan' are
> two
> > > different players!
> > >
> >
> > Yup, the nomenclature for the names, fouls and
> > everything with the log is standardized, so I
> won't
> > run into 'chan' and 'Chan.'  thanks for the heads
> up
> > though.
> >
> > > > How would I print the %fouls hash out so that
> the
> > > > output would be grouped by type of foul?  Here
> is
> > > > an example of the output I'd like to see.
> > > >
> > > > Offensive fouls:
> > > > Chan: 3
> > > > Rodriguez: 1
> > > > Smith: 1
> > > >
> > > > Personal fouls:
> > > > Chan: 1
> > > > Rodriguez: 4
> > > > Smith: 1
> > > >
> > > > Shooting fouls:
> > > > Chan: 1
> > > > Rodriguez: 1
> > > > Smith: 2
> > > >
> > > > would I nest foreach loops?  If so, I'm still
> not
> > > > sure how I'd do that.
> > >
> > > You'd have to look at the three subhashes
> > > separately. Try this
> > >
> > >   foreach $type ( qw/Offensive Personal
> Shooting/ )
> > > {
> > >     printf "%s fouls\n", $type;
> > >     my $rank = $fouls{lc $type};
> > >     foreach my $player (keys %$rank) {
> > >       printf "%s: %d\n", $player,
> $rank->{$player};
> > >     }
> > >   }
> > >
> >
> > Hmm, it's not.
> 
> Not what? :)
> 

My mistake, I meant to write that below, it wasn't
clear.

> > I'm getting confused by the variable
> > names and what each represent since the $1 or the
> $3
> > isn't in there.
> 
> Scalar $type holds the foul type. The same as $3 on
> input.
> Scalar $player holds the player name. The same as $1
> on input.
>

Yes, but was supposed to assume that further up in the
code I would have assigned $1 to $player, and $3 to
$type?  That's where a lot of my confusion came from.
Then, what does $rank refer to?  Wait, it looks like
it is assigned to 
$fouls{$type}
so then $rank would have a key of foultype, and a
value of player name which is also a key and would
have a value of the number of fouls?  Is that it?
and I'm not familiar with this syntax: 
%$rank


> > Also, can I do it without the reference?
> 
> You can do it without the hash reference but it
> looks more
> confusing that way. You can't get around the fact
> that the
> level 2 hashes are anonymous ones so you need to
> understand
> references.
> 

I asked because I'm still moving in baby steps here. 
:)  References are next.
Before this would work, I'd have to assingn $3 to
$type and $1 to $player, right?

>   foreach my $type ( qw/Offensive Personal Shooting/
> ) {
>     printf "%s fouls\n", $type;
>     foreach my $player ( keys %{$fouls{$type}} ) {
>       printf "%s: %d\n", $player,
> $fouls{$type}{$player};
>     }
>   }
> 

Thanks, -stu


> Cheers,
> 
> Rob
> 
> 
> 
> 
> -- 
> To unsubscribe, e-mail:
> [EMAIL PROTECTED]
> For additional commands, e-mail:
> [EMAIL PROTECTED]
> 


__________________________________
Do you Yahoo!?
Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
http://calendar.yahoo.com

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to