in reply to Parsing hash reference as argument for subroutine

You should use strict and warnings, it would have helped you avoid some trouble.

$matrix is not declared, you should have a my $matrix = {}; at the beginning of the function. This function does not return $matrix. But then again, there are three { block opener but only two } block ends, this doesn't even compile.

To see what's inside a nested data structure (like a hash of hashes), you can use Data::Dumper like this :

use Data::Dumper; #At the top of the file ... print Dumper $P;

And at last, you probably want to read perldsc