3

我以为您以前可以在“严格”模式下执行此操作,但我可能记错了。像这样的东西有可能工作......

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#”与相应的变量。还能够同时指定一个包和一个变量(或常量)将是一个不错的好处。

4

2 回答 2

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;

或者,如果由于某种原因您需要$VarNameto be'TargetPID'和 not的值'$TargetPID',您可以这样做print eval '$' . $VarName

于 2013-05-31T18:23:39.907 回答
1

您可以为此使用该PadWalker模块。从文档中:

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 的模块在生产中肯定是安全的和有用的。

于 2013-05-31T19:35:15.477 回答