在Perl中,如何使用字符串作为变量名?

时间:2010-10-06 10:14:37

标签: perl string variables

  

可能重复:
  How can I use a variable as a variable name in Perl?

这可行吗?我需要将字符串更改为变量。

示例:

如果我有这样的变量:

$this_is_test = "what ever";
$default = "this";
$default = $default . "_is_test";

我希望$default获取$this_is_test的值。

2 个答案:

答案 0 :(得分:13)

沿着my other answer,每当您发现自己将字符串后缀添加到变量名称时,请使用哈希:

my %this = (
    is_test => "whatever",
    is_real => "whereever",
);

my $default = $this{is_test};

print "$default\n";

为此目的使用符号引用,因为它们是不必要的,并且在您的问题的上下文中可能非常有害。有关详细信息,请参阅Why it's stupid to 'use a variable as a variable name'?part 2part 3mjd

答案 1 :(得分:4)

正如rafl所说,这可以通过符号引用来实现,但它们非常危险(它们是代码注入向量)并且不适用于词法变量(并且应该使用词法变量而不是包变量)。每当你想要一个符号引用时,你几乎肯定想要一个哈希。而不是说:

#$this_is_test is really $main::this_is_test and is accessible from anywhere
#including other packages if they use the $main::this_is_test form 
our $this_is_test = "what ever";
my $default       = "this";
$default          = ${ $default . "_is_test" };

你可以说:

my %user_vars = ( this_is_test => "what ever" );
my $default   = "this";
$default      = $user_vars{ $default . "_is_test" };

这将%user_vars的范围限制在创建它的块中,并且密钥与实际变量的隔离限制了注入攻击的危险。