Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you explain Perl's hash system to a PHP guy?

How do Perl hashes work? Are they like arrays in PHP or some completely different beast?

From what I understand all it is is an associative array right? This is what I thought until I began to talk to a Perl programmer who told me I was completely wrong, but couldn't explain it in a way that didn't make my eyes cross.

Anyway, the way that I thought it worked was like this

PHP's:

$argv['dog_name'] = 'missy';
$argv[0] = 'tree';

same as Perl's:

my %argv{'dog_name'} = 'missy';
my $argv[0] = 'tree';

Right? But you cannot print(%argv{'dog_name'}), you have to (revert?) to print($argv{'dog_name'}) which is confusing?

Is it trying to print as a variable now, like you would in PHP, echo $argv['dog_name']; ? Does this mean (again) that a hash is just a PHP associative array with a % to declare but a $ to access?

I don't know, I'm hoping some PHP/Perl Guru can explain how hashes work, and how similar they are to PHP's arrays.

like image 257
ehime Avatar asked Nov 29 '22 03:11

ehime


1 Answers

To write

$argv['dog_name'] = 'missy';
$argv[0] = 'tree';

in Perl, you would write it as follows:

$argv{dog_name} = 'missy';
$argv{0}        = 'tree';

if you had strict on, which you should, then you will need to predeclare the variable:

my %argv;
$argv{dog_name} = 'missy';
$argv{0}        = 'tree';

If the above is a bit repetitive for you, you could write it:

my %argv = (
    dog_name => 'missy',
    0        => 'tree',
);

You can find more detail on the perldata manpage.

In short, the reasons why the sigils change from % to $ is that %hash refers to a plural hash (a list of key value pairs), and $hash{foo} refers to a single element of a hash. This is the same with arrays, where @ refers to the full array, and $ refers to a single element. (for both arrays and hashes a leading @ sigil with a subscript means a slice of the data, where multiple keys are passed and a list of values are returned)

like image 116
Eric Strom Avatar answered Nov 30 '22 18:11

Eric Strom