使用var在Perl中选择var

时间:2013-05-31 18:14:34

标签: perl variables

我以为你曾经能够在“严格”模式下这样做,但我可能记错了。这样的事情有可能发挥作用......

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。

2 个答案:

答案 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的模块是   当然对生产安全和有用。