XP is just a number PerlMonks

### Hash Keys (strings or numbers?)

by robot_tourist (Hermit)
 on Nov 14, 2001 at 14:55 UTC Need Help??

Just as there are different operators for comparing strings and numbers, you should be aware how that affects accessing elements of hashes.

Consider the following:

```my \$key1 = '00001';
my \$key2 = 1;
my %hash1 = (1 => 1);
my %hash2 = (1 ,  2);
my %hash3;
\$hash3{\$key1} = 3;
my %hash4;
\$hash4{\$key2} = 4;
Obviously, \$key1 == \$key2, but \$key1 ne \$key2. That is, they are equal as numbers, but since \$key1 is a string and \$key2 is not, then they will not match using the eq string operator. This leads to the following:

```00001 == 1       That is: \$key1 == \$key2
00001 ne 1       That is: \$key1 ne \$key2

\$hash1{\$key1} is undef
\$hash1{\$key2} == 1
\$hash2{\$key1} is undef
\$hash2{\$key2} == 2
\$hash3{\$key1} == 3
\$hash3{\$key2} is undef
\$hash4{\$key1} is undef
\$hash4{\$key2} == 4
This is particularly important when working with databases, for example, where the key field may be zerofilled.

Replies are listed 'Best First'.
Re: Hash Keys (strings or numbers?)
by petral (Curate) on Nov 15, 2001 at 03:29 UTC
Leading zero's can turn octal on you:
```\$ perl -lwe 'print shift() + 4' 012
16
\$ perl -lwe 'print 012 + 4'
14
\$ perl -lwe'print "012" + 4'
16
\$

p
Re: Hash Keys (strings or numbers?)
by ruzam (Curate) on Mar 02, 2012 at 14:20 UTC
When working with databases I've learned (through past mistakes) to always use '\$key += 0' on numeric field results to ensure they don't get quirky string representations.
Re: Hash Keys (strings or numbers?)
by cybear (Monk) on Jun 08, 2006 at 14:36 UTC
I see the difference and that is worth keeping in mind... but so what? How does that affect the speed or effectiveness of accessing hashes by number or string? Is there any real difference in the efficiency of string vs. number? That is not explored.

Re: Hash Keys (strings or numbers?)
by Artemus (Novice) on Mar 02, 2012 at 07:46 UTC
Unfortunately, none of the examples converts \$key1 into a number so that \$hash1{int(\$key1)} eq \$hash1{int(\$key2)}, when \$key1 == \$key2.

Create A New User
Node Status?
node history
Node Type: perltutorial [id://125289]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (3)
As of 2018-07-18 01:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
It has been suggested to rename Perl 6 in order to boost its marketing potential. Which name would you prefer?

Results (383 votes). Check out past polls.

Notices?