插入Perl变量

插入Perl变量,perl,Perl,我想在另一个Perl变量中插入一个标量变量。例如: my $var = "test"; my $test_1 = "DONE\n"; 我想打印$test\u 1的值,但要使用$var。 我想先插入$var,并将其值作为$test\u 1。我们能做到这一点吗 ... $hello = "ciao"; $$hello = "salut"; # $ciao = "salut"; print $ciao; # prints "salut" ... 不建议采用这

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

my $var = "test";
my $test_1 = "DONE\n";
我想打印
$test\u 1
的值,但要使用
$var
。 我想先插入
$var
,并将其值作为
$test\u 1
。我们能做到这一点吗

...
$hello = "ciao";
$$hello = "salut"; # $ciao = "salut";
print $ciao; # prints "salut"
...
不建议采用这种做法

...
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:(极度沮丧) 为了适合您的数据,您可以执行以下操作:

$var = "test";
${$var."_1"} = "done\n";
print $test_1; # prints `done\n`
结束编辑1 最好使用散列

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

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

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

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

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


Mark Dominus写了一篇文章解释了为什么这是一个糟糕的想法。

因为
my$test\u 1
声明了一个词法变量,我们不能使用像
${“test\u 1”}
“${$var.”
这样的符号引用。Perl的符号引用忽略
my
中的词法变量并查找全局变量

我们可以将一个Perl代码字符串传递给
eval()
,它可以看到调用方的词汇变量:

my $var = "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"}};
但是如果有人可以注入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";
print eval("\${${var}_1}");
my $var = "test";
my $test_1 = "DONE\n";
my %hash = (
    test_1 => \$test_1,
);
print ${$hash{$var . "_1"}};
丢失
$test\u 1
变量并将其值存储在
$hash{test\u 1}
中可能更简单:

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

最好解释一下你们在做什么,因为你们想要的是糟糕的实践。我想要插值第一个变量的值,并创建我从第一个变量得到的值的变量。(我知道有点混乱)我尝试使用$$var,但没有得到结果。symrefs只使用包变量,而不使用
my
变量。将
my$test\u 1
更改为
our$test\u 1
,它就可以工作了。好的;足够公平。我已经删除了我的注释;您可以删除您的响应;我很快就会删除它。