Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Hash Keys (strings or numbers?)

by robot_tourist (Hermit)
on Nov 14, 2001 at 14:55 UTC ( [id://125289]=perltutorial: print w/replies, xml ) 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 $

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.

    - cybear

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.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perltutorial [id://125289]
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (2)
As of 2024-07-25 19:04 GMT
Find Nodes?
    Voting Booth?

    No recent polls found

    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.