插值perl变量

时间:2014-03-25 09:34:33

标签: perl

我想在另一个perl变量中插入一个标量变量。例如:

my $var = "test";
my $test_1 = "DONE\n";

我想打印$test_1的值,但要使用$var。 我想首先插入$var&结果为$test_1。我们可以做到这一点吗?

4 个答案:

答案 0 :(得分:8)

...
$hello = "ciao";
$$hello = "salut"; # $ciao = "salut";
print $ciao; # prints "salut"
...

这种做法不推荐

EDIT1 :(非劝阻)

为了适合您的数据,您可以这样做:

$var = "test";
${$var."_1"} = "done\n";
print $test_1; # prints `done\n`

END EDIT1

使用哈希会更好。

...
my %hash = ();
my $key = "ciao"; # in the example seen before this was `$hello`
$hash{$key} = "salut"; # $hash{ciao} = "salut";
print $hash{ciao}; # will print "salut".
...

答案 1 :(得分:2)

您希望将变量用作另一个变量的名称。这是一个糟糕的主意。总有一种更好的方法。如果您解释了为什么要这样做,那么我们可以帮助您找到更好的替代方案(可能涉及使用哈希)。

Mark Dominus写了series three articles来解释为什么这是一个糟糕的主意。

答案 2 :(得分:1)

您想要的是一个符号引用,其中标量变量用作另一个变量的名称。你可能会感受到危险的甜味。但无论如何:

$var = "test";
$test_1 = "DONE\n";
print ${"${var}_1"};

正如Amon所指出的,符号引用不适用于词法my变量。

答案 3 :(得分:1)

由于my $test_1声明了词法变量,因此我们无法使用${"test_1"}"${$var . "_1"}等符号引用。 Perl的符号引用忽略来自my的词法变量并查找全局变量。

我们可能会将一串Perl代码传递给eval(),它可以看到其调用者的词汇变量:

my $var = "test";
my $test_1 = "DONE\n";
print eval("\${${var}_1}");

但如果有人可以注入Perl代码,那么调用eval()会很危险:

my $var = 'a} if 0; system "echo EVIL"; ${test';
my $test_1 = "DONE\n";
print eval("\${${var}_1}");

相反,我们可以创建一个哈希,其中键是名称,值是对局部变量的引用:

my $var = "test";
my $test_1 = "DONE\n";
my %hash = (
    test_1 => \$test_1,
);
print ${$hash{$var . "_1"}};

丢失$test_1变量并将其值存储在$hash{test_1}中可能更简单:

my $var = "test";
my %hash = (
    test_1 => "DONE\n",
);
print ${$hash{$var . "_1"}};