Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How do I interpolate the value in a string variable into a constant in Perl?

I am writing a function in Perl, where a string is passed as an argument, and I need to interpret the string into the referenced value. The string would look something like this:
"Edible => 1;Fruit => STRAWBERRY;"
Now, the variable part will be stored using hashes, however, the value is already defined using constants. My question is, once I store the value into a temporary variable, how do I convert it into the value of the constant?
Here is some example code:

#!/usr/bin/perl

require Exporter;

our @ISA = 'Exporter';
our @EXPORT = qw(STRAWBERRY TANGERINE PEAR APPLE PERSIMMON FUNC_Interpreter);

use constant {
    STRAWBERRY => 1
   ,TANGERINE => 2
   ,PEAR => 3
   ,APPLE => 4
   ,PERSIMMON => 5
};

sub FUNC_Interpreter {
    my ($analyze_this) = @_;
    my @values;
    foreach my $str (split (/;/, $analyze_this)) {
        my ($key, $value) = split /=>/, $str;
        push (@values, @{[ $value ]});           # Problem line! I want to store the numeric value here. This doesn't work... :(
    }
}

FUNC_Interpreter ("HELLO=>TANGERINE;HELLO=>STRAWBERRY");

So basically, what I want to do is convert a string, which is actually the name of a constant stored in a variable, into a constant’s value. Is this possible?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Constants can be treated as subs.

{
   no strict qw( refs );
   push @values, $value->();
}

or

push @values, ( \&$value )->();

But that’s a hackish risky approach. And the second version even hides that you are dangerously allowing the user to call any sub in any package. What I would do instead:

my %lookup;
BEGIN {
   %lookup = (
      STRAWBERRY => 1,
      TANGERINE  => 2,
      PEAR       => 3,
      APPLE      => 4,
      PERSIMMON  => 5,
   );
}

use constant \%lookup;
push @values, $lookup{ $value };

Using this approach, inputs can be validated trivially, and invalid inputs merely result in undef.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading