Значение переменной Perl представляет другую переменную - PullRequest
1 голос
/ 10 ноября 2010
my $var = "Hello";
my $Hello = "Hi";

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

Ответы [ 2 ]

14 голосов
/ 10 ноября 2010

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

0 голосов
/ 10 ноября 2010

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

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.";

Как и было предложено DVK, 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 ."

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...