This short Perl hex Tutorial will show you how to use this function in various contexts. I’ll point out through several snippet code examples what I consider more important in order to highlight the topic.Two syntax forms are available for Perl hex function:
This function:- has as argument a hexadecimal string (or an expression which after evaluation will return a hex string)
- will return the decimal corresponding value
For instance, see below how you can call it:print hex "0x4E8", "\n"; # or
print hex "4e8", "\n";
As you see above, a hexadecimal string begins with the characters 0x (which could be omitted in a hex context) and is case insensitive. Please note that here the hexadecimal strings represent integers and not any other kind of data.In the second syntax form of Perl hex function, the expression argument is omitted and the function will use by default as argument the hexadecimal value stored in the special variable $_.
Next, I’ll give you some examples about how you can use and manipulate Perl hex function and some related considerations.
Check my new How To Tutorial eBooks (PDF format):to see a lot of fully commented examples that help you use the Perl statements and the Perl buit-in functions in your scripts.
| Convert a decimal number into a hexadecimal one |
If Perl hex function converts a hexadecimal value into decimal, maybe you could have expected to find a similar function which will do the reverse, i.e. convert a decimal number into a hexadecimal one. Well, it’s not just like that. We can do this very simply by using the Perl sprintf function formatting, as in the next example:# initialize a scalar variable with an integer value
my $dec = 1211;
print "Hexadecimal number: ", uc(sprintf("%x\n", $dec)), "\n";
# displays 4BB
We used the %x to format the decimal scalar value into hexadecimal and we converted the result in uppercase, but we could let it in lowercase too, as the sprintf function returns it by default.This is a direct conversion method when we need to use a reverse function for Perl hex function. If you want to write some code and emulate the algorithm used by sprintf formatting, here is an example:
# initialize a scalar with an integer value
my $dec = 1211;
# call the subroutine
my $hex = DecToNumBase($dec, 16);
print "Hexadecimal number: $hex\n";
# displays 4BB
# define the subroutine
sub DecToNumBase
{
my $decNumber = $_[0];
my $numBase = $_[1];
my $numNumber = '';
while($decNumber ne 'end')
{
# divide the decimal number by $numBase and
# store the remainder (modulus function) in
# the temporary variable $temp
my $temp = $decNumber % $numBase;
if($temp > 9)
{
$temp = chr($temp + 55);
}
$numNumber = $temp . $numNumber;
$decNumber = int($decNumber / $numBase);
if($decNumber < $numBase)
{
if($decNumber > 9)
{
$decNumber = chr($decNumber + 55);
}
$numNumber = $decNumber . $numNumber;
$decNumber = 'end';
}
}
return $numNumber;
}
In the example above we defined and called the DecToNumBase subroutine which is meant to convert a decimal value into a number in another numeration base. This subroutine has as input two arguments:
- the decimal value to be converted
- the numeration base
The while loop will stop when after dividing the decimal number by the numeration base we will get as result a number less than the numeration base. Please note the using of Perl chr function and the concatenation operator '.'. We called this function to convert a decimal number into a hexadecimal one. You can use this function either to convert a decimal number into octal, binary or whatever. We didn't use Perl hex function in the above subroutine but we consider that the code is useful to see how to do things in similar situations.
| Convert a scalar string to hex |
The following snippet code will show you how to convert a scalar string into its hexadecimal format. It takes any character within the string and returns its hexadecimal code:my $myString="This text is only for test reason 123 [{@!}}|";
my @myArray=unpack('C*', $myString);
my $myStringHex = '';
foreach my $c (@myArray) {
$myStringHex .= "\%" . sprintf ("%lx", $c);
}
print "$myStringHex\n";
The Perl unpack function uses the C parameter to convert each character in byte. Perl sprintf function is used to format the byte code in hex. To get all the converted characters in a string, the concatenation "." operator is used.
An URL (or Uniform Resource Locator) is a particular type of URI (which stands for Uniform Resource Identifier). By URI we mean a specific string used to identify an abstract or physical resource.Everyone who is searching through Internet knows about URL (or more precisely, he should know). Let’s say that through URL we understand an internet address of a page we are searching for, it could be the address of this page too (URL=http://www.misc-perl-info.com/perl-hex.html).
There are some restrictions of using the characters in an URL. Through the characters allowed there are the alphanumerical characters [0-9a-zA-Z], some punctuation symbols $-_.!*'(), and some reserved characters used for other purposes.
All the other characters must be encoded, because they could be misunderstood if they are found within an URL. To encode a character means to replace it by the symbol % followed by its two-digit hexadecimal code. For instance, the space character which has the hexadecimal code 20, will be represented as %20.
The simplest mode to encode or decode an URL is by using the Perl URI::Escape module, which exports the following functions:
- uri_escape – which replaces (encodes) all unsafe characters within a URL string with two hexadecimal digits preceded by the % symbol
- uri_unescape – which unencodes all the characters within an URL, i.e replaces any occurrence of % followed by two hexadecimal digits into their corresponding character (in other words converts an encoded URL to its normal representation)
The next example will show you how to do this:use URI::Escape;
# Encode URL
my $url = "http://www.google.com/search?q=book";
my $encodedURL = uri_escape($url);
print "Encoded URL: $encodedURL\n\n";
# Decode URL
$encodedURL =
"http://%77%77%77%2e%79%61%68%6f%6f%2e%63%6f%6d";
my $decodedURL = uri_unescape($encodedURL);
print "Decoded URL: $decodedURL\n";
The uri_unescape function is very useful if you will receive an invitation to click on a link with escaped characters that looks like "http://%77%77%77%2e%79%61%68%6f%6f%2e%63%6f%6d" and it will be nice to know where you will go if you click on it. Decode it like in the example above and than decide what you will do. If you want to see what URL represents the above address, just copy the string above (neglect the quotes) in your browser address bar and see where it is pointing out (in my 3.0.6 FireFox it works).
We hope that these considerations help you see how to use Perl hex function in your scripts. If you have any idea to add some more useful examples about Perl hex function, feel free to tell me by using my contact form.
If you want to download the Perl hex script with all the above examples included, please click here: Script download