in reply to convert hex string to hex number

Thanks everyone for all the insights. As it turned out, just converting it to oct, as waldner suggested, worked the easiest. Other solutions seemed to lop off leading 0's or for whatever reason would not be accepted by Gtk2 as hex. If I hard code a number with a leading 0x it would accept it, but it wouldn't accept any 0x in a variable.... it had to be converted to a oct or decimal number.
#!/usr/bin/perl my $x = 0; my $y = 0; my $z = 255; my $hex = sprintf( "0x%02x%02x%02x40",$x,$y,$z); print "$hex\n"; #works print "hex $hex\n"; my $oct = oct $hex; print "oct $oct\n"; # $rect->set('fill-color-rgba' => $oct ); # works as hex, but leading 0x not acceptable to Gtk2 my $hex1 = sprintf "0x%08x", $oct; print "hex1 $hex1\n"; #$rect->set('fill-color-rgba' => $hex1 ); # pukes on the 0x # would work if I eval'd $hex1, which converted it to decimal

I'm not really a human, but I play one on earth CandyGram for Mongo

Replies are listed 'Best First'.
Re^2: convert hex string to hex number
by tobyink (Canon) on Jan 04, 2012 at 14:41 UTC

    The oct function doesn't "convert" a number to octal. It parses a string which contains the octal representation of a number (and in fact also quietly supports binary and hexadecimal notations too) and returns it as an integer. It essentially acts like eval, but supports an incredibly tiny subset of Perl.

    $number = oct('0644'); $number = eval('0644'); # same

    In your particular case, you could just do this:

    my $n = ($x<<24) + ($y<<16) + ($z<<8) + 0x40; $rect->set('fill-color-rgba' => $n);

    Which will probably run quite a lot faster as it's pretty basic integer maths - just bit shifting and addition.

    An alternative (no faster nor slower) than the above is:

    my $n = ($x<<030) + ($y<<020) + ($z<<010) + 0x40; $rect->set('fill-color-rgba' => $n);

    Why would you want to do it that way? Because if you're familiar with octal it might help you see what's going on a little better.

    Or you can use multiplication instead of bit shifting. This might be a little slower, but if you're unfamiliar with bitwise operations, might be a little clearer:

    my $n = ($x * 2**24) + ($y * 2**16) + ($z * 2**8) + 0x40; $rect->set('fill-color-rgba' => $n);