Это обсуждается в Perl FAQ (7): Как использовать переменную в качестве имени переменной? .
Короче говоря, ответ: не делай этого. Вместо этого используйте хэши.
Более длинный ответ:
Гораздо лучшим и простым решением было бы хранить значения в хэше:
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";
В крайнем случае, вы МОЖЕТЕ использовать символические ссылки. ОДНАКО (как обсуждено в FAQ, связанном выше), они работают ТОЛЬКО с глобальными переменными и ТОЛЬКО, когда не используется `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. Если вы просто хотите использовать значение $Hello
жестко закодированной переменной, вы можете сделать $var2 = $Hello;
, но у меня есть ощущение, что вы хотели использовать любое имя переменной, которое содержится в $ var.