in reply to convert string of chars and numerics to a numeric value

One way to do it would be to split the string into individual characters and sum the ord values for each character. The problem with that is it's easy to get the same answer for different strings. Perhaps you could concatenate the ord values into a string of numbers. This would have the advantage that you could reconstruct the original string from the numbers.

use strict; use warnings; my @strs = qw{smpl95 smpd9 fuj324}; foreach my $str ( @strs ) { print qq{Original: $str\n}; my $numStr = there($str); print qq{Numified: $numStr\n}; my $decoded = backAgain($numStr); print qq{ Decoded: $decoded\n}; print q{-} x 25, qq{\n}; } sub there { my $str = shift; my $numStr; $numStr .= sprintf q{%03d}, ord for split m{}, $str; return $numStr; } sub backAgain { my $numStr = shift; (my $str = $numStr) =~ s{(...)}{chr $1}eg; return $str; }

Here's the output.

Original: smpl95 Numified: 115109112108057053 Decoded: smpl95 ------------------------- Original: smpd9 Numified: 115109112100057 Decoded: smpd9 ------------------------- Original: fuj324 Numified: 102117106051050052 Decoded: fuj324 -------------------------

I don't know if this is anywhere near what you are looking for. Perhaps you could clarify you question?

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: convert string of chars and numerics to a numeric value
by js1 (Monk) on Apr 20, 2007 at 12:02 UTC

    John,

    Thanks. That's more or less what I was after. In the line below, could you explain how ord for split m{} works please? I haven't seen that syntax before. Very cool though!

    $numStr .= sprintf q{%03d}, ord for split m{}, $str;
      I'm glad my guess was along the right lines. Perhaps if I expand the code it will become clearer what is going on. The main points are: split will break a string into individual characters if given an empty pattern as it's delimiter; ord is one of those built-ins that operates by default on $_; I am using the for (synonym for foreach) as a statement modifier rather than writing an explicit loop. So, in English, concatenate $newStr with the ordinal value, formatted to three digits with leading-zero padding, of each character in the string. These characters are passed one at a time in the variable $_ to the .= statement by the for statement modifier from the list that results from the split statement.

      Here's the code expanded and using temporary variables.

      foreach my $char ( split m{}, $str ) { my $ordVal = ord $char; my $fixedWidthOrdVal = sprintf q{%03d}, $ordVal; $numStr .= $fixedWidthOrdVal; }

      I hope that has explained the code satisfactorily but, if not, please ask.

      Cheers,

      JohnGG