2010-11-10 2 views
1
my $var = "Hello"; 
my $Hello = "Hi"; 

мой вопрос: как я могу подставить значение $ Hello в $ var? Здесь $ var содержит строку «Hello» (есть переменная с тем же именем $ Hello). Я ищу способ заменить его значением переменной $ Hello. Пожалуйста, дайте мне знать, как я могу это сделать?Perl Значение переменной представляет другую переменную

+0

Это очень много спрашивается на SO: [varvarname] (http://stackoverflow.com/search? д = varvarname). – daxim

ответ

14

Это обсуждается в 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.

-3

Если вы готовы заполнить заполнитель в виде строки со значением переменного, вы можете использовать:

my $Hello = "Hi"; 
my $var = "$Hello world"; 
# $var is now "Hi world" 

Если вы хотите заменить каждое вхождение некоторого переменного имени, вы можете использовать:

my $Hello = "Hi"; 
my $greet = "Hello, my name is Jimbo, and I hate Helloween."; 
$greet =~ s/Hello/$Hello/g; 
# $greet is now "Hi, my name is Jimbo, and I hate Hiween."; 

Как предложенный ДВК, Eval также может частично сделать трюк:

my $Hello = "Hi"; 
my $greet = "\$Hello, my name is Jimbo, and I hate \$Helloween."; 
$greet = eval "\"$greet\""; 
# $greep is now "Hi, my name is Jimbo, and I hate ." 

Измените: Извините за краткость моего предыдущего ответа, я набрал его на своем телефоне в приемной ...

+0

Зачем проголосовать, если я могу спросить? Это был не самый лучший ответ, но это было не так, ИМХО. – DVK

+0

Мой первый проект был любопытным ... коротким :) Но, я бы хотел, чтобы объяснение тоже было возможно. –

Смежные вопросы