chakkaln has asked for the wisdom of the Perl Monks concerning the following question:

Hi All, I was wondering if there is a method in perl which can return a numeric value for a string (for example "V$CEBPA"). The idea is to use this information (the numeric value will be used to generate RGB values) to color 7000 different identifiers (like mentioned above) which have a unique name. Any help will be greatly appreciated. Thanks in advance. Nagesh

Update: Thanks a lot to all who have responded to my query and also to those who have read it. I have now found the solution. Meet you all in my next query Cheers Nagesh

  • Comment on Getting numeric value of an alphabetic string

Replies are listed 'Best First'.
Re: Getting numeric value of a alphabetic string
by Zaxo (Archbishop) on Aug 05, 2005 at 06:52 UTC

    You probably want to use a hash for that.

    my %color = ( red => 0xFF0000, blue => 0x0000FF, # . . . );
    On unix, /usr/X11/lib/X11/rgb.txt is a useful list of standardized named colors with RGB values.

    After Compline,
    Zaxo

      Thanks a lot for the message. Its a bit unclear to me as how can I use this information in my case. I have about 7000 unique identifiers and I need 7000 unique colors for that. Thanks Nagesh
        There are 753 unique colours in the openwin rgb.txt on the machine nearest my thumb and the following code indexes them by unique name into a hash of hash :
        #!/usr/bin/perl use Data::Dumper; open RGB, '</usr/openwin/lib/rgb.txt'; my %rgb = (); while ( <RGB> ) { if ( /^(\d+)\s*(\d+)\s*(\d+)\s*(.*)$/ ) { $rgb{ $4 }{ red } = $1; $rgb{ $4 }{ green } = $2; $rgb{ $4 }{ blue } = $3; } } print Dumper( \%rgb );
        output:
Re: Getting numeric value of a alphabetic string
by xdg (Monsignor) on Aug 05, 2005 at 07:04 UTC

    See chr and ord. You can also use unpack to retrieve the character codes for a string in one go:

    $ perl -le 'print for unpack("C*","foo")' 102 111 111

    -xdg

    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

      Thanks a lot. Thats exactly what I am looking for. Will try it and see whether I can make use of this methods. Cheers Nagesh
Re: Getting numeric value of a alphabetic string
by BrowserUk (Patriarch) on Aug 05, 2005 at 07:18 UTC

    Using package constant to define your named constants, is somewhat more efficient that using a hash to perform the mapping:

    #! perl -slw use strict; use Benchmark qw[ cmpthese ]; package C; use constant { RED => 0xFF0000, BLUE => 0x00FF00, GREEN => 0x0000FF, }; package main; use constant { RED => 0xFF0000, BLUE => 0x00FF00, GREEN => 0x0000FF, }; my %colors = ( RED => 0xFF0000, BLUE => 0x00FF00, GREEN => 0x0000FF, ); open STDERR, ">nul"; cmpthese -1, { hash => sub{ warn $colors{ RED }, $colors{ BLUE }. $colors{ GRE +EN }; }, m_const => sub{ warn RED, BLUE. GREEN; }, p_const => sub{ warn C::RED, C::BLUE. C::GREEN; }, }; __END__ P:\test>junk Rate hash m_const p_const hash 116531/s -- -11% -12% m_const 130636/s 12% -- -1% p_const 132428/s 14% 1% -- P:\test>junk Rate hash p_const m_const hash 116531/s -- -9% -10% p_const 128577/s 10% -- -1% m_const 129366/s 11% 1% -- P:\test>junk Rate hash m_const p_const hash 116642/s -- -10% -10% m_const 129468/s 11% -- -0% p_const 129590/s 11% 0% --

    If you're concerned with the namespace pollution of having 7000 constants in your main package (though if you make them all uppercase it precludes most possibilities of collisions), then you could place them into separate (short-named) package and invoke them via their full names as in m_const above.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
    "Science is about questioning the status quo. Questioning authority".
    The "good enough" maybe good enough for the now, and perfection maybe unobtainable, but that should not preclude us from striving for perfection, when time, circumstance or desire allow.
      Thanks for the posting
Re: Getting numeric value of a alphabetic string
by sk (Curate) on Aug 05, 2005 at 06:51 UTC
    What do you mean by string of letters?

    are you talking about this?

    $nums = "123"; $val = $nums * 1; print ("Value = $val\n");

      Thanks for the posting. Sorry for not being clearer. By string of letters i meant a name like "V$CEBPA". So if I can convert this string to a numerical value, I can use it to generate the color which will be unique to this identifier. Thanks Nagesh
        Thanks. I completely missed the point! Please see Zaxo's post. You can basically attach a key to a value in a hash. Which should give what you want

        -SK