I have an example from Shawn C. from another thread, presented here
out of context. The code does just what he meant it to do.
It inverts a hash.
I'm trying to understand what is going on inside the sub function
`invert()'.
------- --------- ---=--- --------- --------
my %hash = (
'./b/fb' => 'fb',
'./b/c/fd' => 'fd',
'./b/l/c/f2' => 'f2',
'./b/g/f/r/fc' => 'fc',
'./b/g/h/r/fb' => 'fb'
);
## %hash is sent to an inversion sub function
my %inv_hash = invert( \%hash );
sub invert {
my $h = shift @_;
my %inv = ();
while( my ( $k, $v ) = each %{ $h } ){
push @{ $inv{$v} }, $k;
}
return %inv;
}
------- --------- ---=--- --------- --------
What is actually being sent at
my %inverse_hash = invert( \%hash );
Inside the sub function:
incoming data is seen as array (@_)
What happened to the hash? Is it flattened or what?
What is actually being shifted off here
my $h = shift @_; (Just one element?)
Here it appears $h is expected to have two parts.
So apparently sending \%hash to this sub function has flattened it
into an array where each elements is made up of the Key and value
of the former array...
while( my ( $k, $v ) = each %{ $h } ){
It appears above that $h has all the former parts of the hash
else how can it be looped?
but at `my $h = shift @_;'
It looks like only one is shifted.
Then at:
push @{ $inv{$v} }, $k;
It appears the parts to an array are again flattened into
an array
Then here:
return %inv;
It magically becomes a hash again only upside down.
and of course same name keys are zapped.
%inv_hash is now:
'fc' => './b/g/f/r/fc'
'f2' => './b/l/c/f2'
'fb' => './b/fb' (might be './b/g/h/r/fb'. One was deleted)
'fd' => './b/c/fd'
or seen through Data::Dumper:
Key fc | value ARRAY(0x8bb29c0)
Key f2 | value ARRAY(0x8bb2a60)
Key fb | value ARRAY(0x8bb29f0)
Key fd | value ARRAY(0x8bb2a20)
There is a lot happening in there... but I'm not following how it
happens.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/