我以为你曾经能够在“严格”模式下这样做,但我可能记错了。这样的事情有可能发挥作用......
use strict;
use warnings;
package SomePackage;
my $TargetPID="demo:5"; #using "our" also works, but not in strict mode
my $VarName="TargetPID";
print ${$VarName}; #works but not in strict or if the var is declared with "my"
exit;
我感兴趣的原因是我试图根据文本文件中的文本标志选择变量,我想将文本文件的内容读入哈希,然后替换一些标识符沿着“#TargetPID#”的行与相应的变量。能够同时指定包和变量(或常量)将是一个很好的tbonus。
答案 0 :(得分:6)
我想不出以你尝试过使用哈希的方式做任何优势:
use strict;
use warnings;
package SomePackage;
my %vars = ();
$vars{'TargetPID'}="demo:5";
my $VarName="TargetPID";
print $vars{$VarName};
exit;
如果您确实必须使用$TargetPID
作为变量而不是散列的成员,则可以使用eval
:
my $TargetPID = "demo:5";
my $VarName = '$TargetPID';
print eval $VarName;
或者,如果由于某种原因您需要$VarName
的值为'TargetPID'
而不是'$TargetPID'
,则可以print eval '$' . $VarName
。
答案 1 :(得分:1)
您可以使用PadWalker
模块。来自documentation:
PadWalker是一个允许您检查(甚至更改!)的模块 任何调用你的子程序中的词法变量。它只会 显示那些在调用点范围内的变量。
在您的情况下,您需要使用peek_my
,它执行它所说的内容:它允许您查看在给定范围内由my
声明的变量。
#!/usr/bin/perl
use warnings;
use strict;
package SomePackage;
use PadWalker qw/peek_my/;
my $TargetPID = "demo:5";
my $VarName = "TargetPID";
print ${peek_my(0)->{'$' . $VarName}}
子例程peek_my
接受一个参数,一个级别,即在堆栈上返回的子例程调用的数量。然后,它返回给定调用时范围内的所有词法my
变量的哈希映射。在您的情况下,您想要的变量在与需要的范围相同的范围内定义,因此您将传入0
,以返回0子例程调用。然后你像任何其他哈希引用一样提取你需要的数据。
但请注意文档:
PadWalker对调试特别有用(强调我的。)它甚至被用于 Perl的内置调试器。 (当然,它也可以用于邪恶。)
我不建议直接在生产代码中使用PadWalker,但是 这是你的电话。一些在内部使用PadWalker的模块是 当然对生产安全和有用。