Perl变量值表示另一个变量

rpg*_*rpg 1 perl

my $var = "Hello";
my $Hello = "Hi";
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何在$ var中替换$ Hello的值?这里$ var包含字符串"Hello"(有一个名为$ Hello的变量).我正在寻找一种方法用变量$ Hello的值替换它.请让我知道我该怎么做?

DVK*_*DVK 14

这在Perl FAQ(7)中讨论:如何将变量用作变量名?.

简而言之,答案是:不要这样做.请改用哈希.

更长的回答:


一个更好,更简单的解决方案是将值存储在哈希中:

my %sayings = ("Hello" => "Hi");
my $key = "Hello";
my $var2 = $sayings{$key};
Run Code Online (Sandbox Code Playgroud)

你也可以使用eval:

my $var = "Hello";
my $Hello = "Hi";

print "1.$var\n";

my $var2 = eval "\$$var";

print "2.$var2\n";
Run Code Online (Sandbox Code Playgroud)

作为最后的手段,您可以使用符号引用.然而(正如上面链接的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.
Run Code Online (Sandbox Code Playgroud)

PS如果您只想使用$Hello硬编码变量的值,您可以这样做$var2 = $Hello;,但我觉得您的意思是您想要使用$ var中包含的变量名称.