Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I create a Perl variable name based on a string?

In Perl, is it possible to create a global variable based on a string?

E.g., if I had a function like:

sub create_glob_var {
    my ($glob_var_str) = @_;
    # something like this ( but not a hash access).
    our ${$glob_var_str};
};

and I called it like:

create_glob_var( "bar" );

How could I modify create_glob_var to actually create a global variable called $bar?

My project is using perl 5.8.5.

EDIT

The following doesn't work:

use strict;
BEGIN {
  sub create_glob_var {
    my ($glob_var_str) = @_;
    no strict 'refs';
    $$glob_var_str = undef;  # or whatever you want to set it to
  }

  create_glob_var("bah");
};

$bah = "blah";

Produces:

Variable "$bah" is not imported at /nfs/pdx/home/rbroger1/tmp2.pl line 12.
Global symbol "$bah" requires explicit package name at /nfs/pdx/home/rbroger1/tmp2.pl line 12.
Execution of /nfs/pdx/home/rbroger1/tmp2.pl aborted due to compilation errors.

NOTE I realize that using global variables causes ozone depletion and male pattern baldness. I'm trying to clean up some legacy code that is already completely infected with the use of global variables. One refactor at a time...

like image 706
Ross Rogers Avatar asked Feb 16 '10 18:02

Ross Rogers


People also ask

How do you create a variable name from a string?

String Into Variable Name in Python Using the vars() Function. Instead of using the locals() and the globals() function to convert a string to a variable name in python, we can also use the vars() function. The vars() function, when executed in the global scope, behaves just like the globals() function.

How do I create a dynamic variable in Perl?

We can generate dynamic variable names in Perl using Symbolic References. To use the feature, we have to turn off strict refs. The code below generates the variable names 'var1', 'var2', 'var3' dynamically in a loop as strings, names which can be used as actual variable names with the help of symbolic references.

Can a variable name be a string?

A string variable is a variable that holds a character string. It is a section of memory that has been given a name by the programmer. The name looks like those variable names you have seen so far, except that the name of a string variable ends with a dollar sign, $. The $ is part of the name.

What is $@ in Perl?

$@ The Perl syntax error or routine error message from the last eval, do-FILE, or require command. If set, either the compilation failed, or the die function was executed within the code of the eval.


1 Answers

If you are trying to clean up old code, you can write a module which exports the required variable(s). Every time you feel the need to invoke create_glob_var, instead add a variable to this package and put that in the import list.

This will help you keep track of what is going on and how variables are being used.

package MyVars;

use strict; use warnings;

use Exporter 'import';

our($x, %y, @z);

our @EXPORT_OK = qw( $x %y @z );

The script:

#!/usr/bin/perl

use strict;use warnings;

use MyVars qw( $x %y @z );

$x = 'test';
%y = (a => 1, b => 2);
@z = qw( a b c);

use Data::Dumper;
print Dumper \($x, %y, @z);

Output:

$VAR1 = \'test';
$VAR2 = {
          'a' => 1,
          'b' => 2
        };
$VAR3 = [
          'a',
          'b',
          'c'
        ];
like image 105
Sinan Ünür Avatar answered Sep 22 '22 18:09

Sinan Ünür