我想在另一个perl变量中插入一个标量变量。例如:
my $var = "test";
my $test_1 = "DONE\n";
我想打印$test_1
的值,但要使用$var
。
我想首先插入$var
&结果为$test_1
。我们可以做到这一点吗?
答案 0 :(得分:8)
...
$hello = "ciao";
$$hello = "salut"; # $ciao = "salut";
print $ciao; # prints "salut"
...
这种做法不推荐。
为了适合您的数据,您可以这样做:
$var = "test";
${$var."_1"} = "done\n";
print $test_1; # prints `done\n`
使用哈希会更好。
...
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)
您希望将变量用作另一个变量的名称。这是一个糟糕的主意。总有一种更好的方法。如果您解释了为什么要这样做,那么我们可以帮助您找到更好的替代方案(可能涉及使用哈希)。
答案 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"}};