Это обсуждается в Perl FAQ (7): How can I use a variable as a variable name?.
Короче говоря, ответ: не делайте этого. Вместо этого используйте хеши.
Более длинный ответ:
НАМНОГО лучше и более простое решение было бы хранить значения в хэш:
my %sayings = ("Hello" => "Hi");
my $key = "Hello";
my $var2 = $sayings{$key};
Вы также можете использовать Eval:
my $var = "Hello";
my $Hello = "Hi";
print "1.$var\n";
my $var2 = eval "\$$var";
print "2.$var2\n";
В крайнем случае вы МОЖЕТЕ использовать символические ссылки. ОДНАКО (как обсуждалось в часто задаваемых вопросах), они ТОЛЬКО работают над глобальными переменными и ТОЛЬКО, когда `use strict 'refs`` не действует, что всегда должно быть для нормальной разработки Perl.
##############################################################
# This works. But only without "use strict" and on a package (global) variable.
##############################################################
no strict; # BOO! Bad coder!
my $var = "Hello";
$Hello = "Hi"; #Look, ma, GLOBAL VARIABLE! Bad Coder!
print "1.$var\n";
my $var2 = ${$var}; # You could use $$var shorthand
print "2.$var2\n";
# OUTPUT:
# 1. Hello
# 2. Hi
##############################################################
# I meant it about package (global variable)
##############################################################
no strict;
my $var = "Hello";
$Hello = "GLOBAL value";
my $Hello = "Hi";
print "1.$var\n";
my $var2 = ${$var}; # You could use $$var shorthand
print "2.$var2\n";
# OUTPUT - see how we don't get "Hi" on a second line
# If we did not assign "GLOBAL Value" to $Hellp on line 3
# , second line would contain no value at all (e.g. "2.")
# 1. Hello
# 2. GLOBAL value
##############################################################
# And, if you do what you SHOULDA done and used strict:
##############################################################
use strict; # Much better!
my $var = "Hello";
my $Hello = "Hi";
print "1.$var\n";
my $var2 = ${$var}; # You could use $$var shorthand
print "2.$var2\n";
# OUTPUT:
# Global symbol "$Hello" requires explicit package name at line 4.
# Execution aborted due to compilation errors.
P.S. Если вы просто хотите использовать переменную hardcoded $Hello
, вы можете сделать $var2 = $Hello;
, но у меня есть ощущение, что вы хотите использовать любое имя переменной, содержащееся в $ var.
Это очень много спрашивается на SO: [varvarname] (http://stackoverflow.com/search? д = varvarname). – daxim